【问题标题】:how to overload the == operator for strings? [closed]如何为字符串重载 == 运算符? [关闭]
【发布时间】:2019-05-12 20:55:38
【问题描述】:

我将如何覆盖 == 运算符的行为以进行不区分大小写的比较?

var areSame = "alex" == "ALex";

我希望areSame 成为true

有没有办法重载/覆盖== 运算符的行为以进行不区分大小写的比较?

【问题讨论】:

  • 即使这是可能的,但它确实似乎是解决问题的错误方法。既定的规范行为将从根本上改变,这可能会产生各种意想不到的副作用,并使未来的支持非常变得困难。
  • 对于字符串比较,另请参阅thisthisthis,可能还有其他一些。有关内置类型的重载运算符,请参阅 thisthis
  • @l--''''''------'''''''''''' 变化不大。添加了功能,但核心功能并没有真正改变。这些相关问题的答案仍然非常有效。
  • @l--''''''------'''''''''''' 任何这样的改变都将是一个巨大的突破性改变。
  • 哈哈,有趣的是这个问题有如此严厉的批评,他们只能说它“太宽泛了”

标签: c# .net


【解决方案1】:

您不能,但您可以使用 StringComparer.OrdinalIgnoreCase.Equals(...) 或使用 StringComparer.CurrentCultureIgnoreCase(取决于您的需要)。

如果您真的不想以重大方式更改代码,请考虑将值包装在值对象模式中。您可以向System.String 添加隐式转换,但提供您想要的运算符。

【讨论】:

  • 我不想在我的代码库中这样做
  • 无论如何都要更清洁 .ToLower()
  • @l--''''''---------''''''''''''' 抱歉,这不是一个选项。您可以将字符串包装在值对象模式中并以这种方式控制它。
  • 我的意思是调用.ToLower() 对空值不安全。
  • @l--''''''---------'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''语言的核心特征。访问空对象的任何非静态成员都会抛出NullReferenceException(不包括扩展方法)。如果您想要“安全”成员访问,您可以始终使用空条件运算符,例如foo?.ToLower(),但我仍然建议使用正确的 StringComparerString.Equals
【解决方案2】:

您不能覆盖预先存在的类的运算符。你能得到的最接近的是做一个扩展方法:

public static bool EqualsCaseInsensitive(this String a, String b) {
  return String.Equals(a, b, StringComparison.OrdinalIgnoreCase);
}

你可以这样使用它:

var areSame = stringA.EqualsCaseInsensitive(stringB);

话虽如此,向String 等核心类型添加扩展方法被认为是一种不好的做法。最好只使用实用程序方法进行比较。在这种特殊情况下,您需要的实用方法已经存在:

var areSame = String.Equals(stringA, stringB, StringComparison.OrdinalIgnoreCase);

【讨论】:

  • 你能链接到一些说向内置类型添加扩展方法是不好的做法(或解释原因)吗?我想读一下。
  • @RufusL 扩展方法在适度使用时非常有用,但如果你广泛依赖它们,它会变得很难看。由于string 可能会出现在几乎每个代码文件中,因此扩展它很快就会开始感觉像是“污染”。但是,您在“恰到好处”和“太多”之间划清界限的地方主要是主观的。在 se.so 上围绕这个主题进行了一些讨论:herehere,但主要归结为品味。
  • @RufusL 还有一种观点认为,过度使用扩展方法会导致面向原型的编程风格被面向对象的语法所隐藏。 Some people 感觉这样会导致不知道你在编码时实际上在做什么。我不确定我是否完全同意这种观点,但这是一个值得阅读的有趣观点。
  • @p.s.w.g 哦,那你说的是方法的数量。不将它们添加到“核心类型”...
  • 谢谢!那么,毕竟,你为什么用扩展方法来回答这个问题?答案可能只是一个静态方法或var areSame = "alex".Equals("ALex", StringComparison.OrdinalIgnoreCase); :D
猜你喜欢
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多