我最近接触了一个大型代码库,并注意到所有字符串比较都使用string . equals()而不是==
你认为这是什么原因?
我最近接触了一个大型代码库,并注意到所有字符串比较都使用string . equals()而不是==
你认为这是什么原因?
当前回答
很大一部分开发人员很可能来自Java背景,使用==比较字符串是错误的,而且不起作用。
在c#中,(对于字符串)没有(实际的)区别,只要它们的类型是字符串。
如果它们的类型是object或T,那么在这里可以看到其他关于泛型方法或操作符重载的回答,因为你肯定想使用Equals方法。
其他回答
很大一部分开发人员很可能来自Java背景,使用==比较字符串是错误的,而且不起作用。
在c#中,(对于字符串)没有(实际的)区别,只要它们的类型是字符串。
如果它们的类型是object或T,那么在这里可以看到其他关于泛型方法或操作符重载的回答,因为你肯定想使用Equals方法。
这两种方法在功能上是相同的——它们比较值。 正如MSDN上写的那样:
关于字符串。Equals方法-确定该实例和 另一个指定的String对象具有相同的值。(http://msdn.microsoft.com/en-us/library/858x0yyx.aspx) About ==—虽然string是引用类型,但相等操作符(==和 !=)的定义是为了比较字符串对象的值,而不是 参考文献这使得字符串相等性的测试更加直观。(http://msdn.microsoft.com/en-en/library/362314fe.aspx)
但如果你的一个字符串实例是空的,这些方法的工作方式是不同的:
string x = null;
string y = "qq";
if (x == y) // returns false
MessageBox.Show("true");
else
MessageBox.Show("false");
if (x.Equals(y)) // returns System.NullReferenceException: Object reference not set to an instance of an object. - because x is null !!!
MessageBox.Show("true");
else
MessageBox.Show("false");
我想补充一点,还有一点不同。这与Andrew发布的内容有关。
这也与在我们的软件中发现一个非常烦人的bug有关。请参阅下面的简化示例(我还省略了空检查)。
public const int SPECIAL_NUMBER = 213;
public bool IsSpecialNumberEntered(string numberTextBoxTextValue)
{
return numberTextBoxTextValue.Equals(SPECIAL_NUMBER)
}
这将编译并总是返回false。而下面将给出一个编译错误:
public const int SPECIAL_NUMBER = 213;
public bool IsSpecialNumberEntered(string numberTextBoxTextValue)
{
return (numberTextBoxTextValue == SPECIAL_NUMBER);
}
我们不得不解决一个类似的问题,有人使用Equals比较不同类型的枚举。在意识到这是错误的原因之前,你会阅读很多次。特别是当SPECIAL_NUMBER的定义不在问题区域附近时。
这就是为什么我真的反对在不必要的情况下使用等号。你失去了一点类型安全。
这篇文章有一篇文章,你可能会觉得很有趣,引用了乔恩·斯基特的话。看起来用途是差不多的。
Jon Skeet指出,实例Equals的性能“在字符串较短时略好——随着字符串长度的增加,这种差异变得完全不重要。”
字符串。Equals确实提供了重载来处理区分大小写和区域性的比较。如果您的代码没有使用这些,开发人员可能只是习惯于Java,在那里(正如Matthew所说),您必须使用. equals方法来进行内容比较。