我最近接触了一个大型代码库,并注意到所有字符串比较都使用string . equals()而不是==
你认为这是什么原因?
我最近接触了一个大型代码库,并注意到所有字符串比较都使用string . equals()而不是==
你认为这是什么原因?
当前回答
我想补充一点,还有一点不同。这与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的定义不在问题区域附近时。
这就是为什么我真的反对在不必要的情况下使用等号。你失去了一点类型安全。
其他回答
我想补充一点,还有一点不同。这与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的定义不在问题区域附近时。
这就是为什么我真的反对在不必要的情况下使用等号。你失去了一点类型安全。
==和String之间有一个微妙但非常重要的区别。=方法:
class Program
{
static void Main(string[] args)
{
CheckEquality("a", "a");
Console.WriteLine("----------");
CheckEquality("a", "ba".Substring(1));
}
static void CheckEquality<T>(T value1, T value2) where T : class
{
Console.WriteLine("value1: {0}", value1);
Console.WriteLine("value2: {0}", value2);
Console.WriteLine("value1 == value2: {0}", value1 == value2);
Console.WriteLine("value1.Equals(value2): {0}", value1.Equals(value2));
if (typeof(T).IsEquivalentTo(typeof(string)))
{
string string1 = (string)(object)value1;
string string2 = (string)(object)value2;
Console.WriteLine("string1 == string2: {0}", string1 == string2);
}
}
}
产生如下输出:
value1: value2: value1 == value2: True value1.Equals (value2):真的 string1 == string2: True ---------- value1: value2: value1 == value2: False value1.Equals (value2):真的 string1 == string2: True
可以看到==运算符对两个明显相等的字符串返回false。为什么?因为泛型方法中使用的==运算符被解析为System定义的op_equal方法。对象(该方法在编译时拥有的T的唯一保证),这意味着它是引用相等而不是值相等。
当有两个值类型为System时。String,则==具有值相等语义,因为编译器将==解析为System.String。op_equal代替System.Object.op_equal。
所以为了安全起见,我几乎总是使用String。我总是得到我想要的值相等语义。
如果其中一个值为null,为了避免nullreferenceexception,我总是使用静态String。=方法:
bool true = String.Equals("a", "ba".Substring(1));
这篇文章有一篇文章,你可能会觉得很有趣,引用了乔恩·斯基特的话。看起来用途是差不多的。
Jon Skeet指出,实例Equals的性能“在字符串较短时略好——随着字符串长度的增加,这种差异变得完全不重要。”
很大一部分开发人员很可能来自Java背景,使用==比较字符串是错误的,而且不起作用。
在c#中,(对于字符串)没有(实际的)区别,只要它们的类型是字符串。
如果它们的类型是object或T,那么在这里可以看到其他关于泛型方法或操作符重载的回答,因为你肯定想使用Equals方法。
字符串。Equals确实提供了重载来处理区分大小写和区域性的比较。如果您的代码没有使用这些,开发人员可能只是习惯于Java,在那里(正如Matthew所说),您必须使用. equals方法来进行内容比较。