我最近接触了一个大型代码库,并注意到所有字符串比较都使用string . equals()而不是==

你认为这是什么原因?


当前回答

这篇文章有一篇文章,你可能会觉得很有趣,引用了乔恩·斯基特的话。看起来用途是差不多的。

Jon Skeet指出,实例Equals的性能“在字符串较短时略好——随着字符串长度的增加,这种差异变得完全不重要。”

其他回答

字符串。Equals确实提供了重载来处理区分大小写和区域性的比较。如果您的代码没有使用这些,开发人员可能只是习惯于Java,在那里(正如Matthew所说),您必须使用. 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的定义不在问题区域附近时。

这就是为什么我真的反对在不必要的情况下使用等号。你失去了一点类型安全。

很大一部分开发人员很可能来自Java背景,使用==比较字符串是错误的,而且不起作用。

在c#中,(对于字符串)没有(实际的)区别,只要它们的类型是字符串。

如果它们的类型是object或T,那么在这里可以看到其他关于泛型方法或操作符重载的回答,因为你肯定想使用Equals方法。

我一直在碰壁,试图解决一个错误,因为我读了这篇文章,得出的结论是,在实践中没有什么有意义的区别,所以我把这个链接贴在这里,以防其他人发现他们从==和=中得到不同的结果。

Object == equal失败,但. equals成功。这有道理吗?

string a = "x";
string b = new String(new []{'x'});

Console.WriteLine("x == x " + (a == b));//True
Console.WriteLine("object x == x " + ((object)a == (object)b));//False
Console.WriteLine("x equals x " + (a.Equals(b)));//True
Console.WriteLine("object x equals x " + (((object)a).Equals((object)b)));//True

这篇文章有一篇文章,你可能会觉得很有趣,引用了乔恩·斯基特的话。看起来用途是差不多的。

Jon Skeet指出,实例Equals的性能“在字符串较短时略好——随着字符串长度的增加,这种差异变得完全不重要。”