使用“==”还是Equals进行字符串比较?

12
在一些语言(如C ++)中,您不能使用像==这样的操作符对字符串进行比较,因为那会比较字符串对象的地址,而不是字符串本身。然而,在C#中,您可以使用==来比较字符串,并且它将实际比较字符串的内容。但是也有字符串函数来处理这种比较,所以我的问题是:您应该使用这些函数吗?
给定两个字符串:
string aa = "aa"; 
string bb = "bb";

你应该像这样进行比较:

bool areEqual = (aa == bb); 

或者你应该使用Equal函数,像这样:

bool areEqual = aa.Equals(bb); 

是否有任何技术上的区别?或者有最佳实践的合理论据吗?


3
小小的挑剔:在C++中,std::string可以使用operator==进行比较。不能进行比较的是char[]char*。在C++中,“string”这个术语有些模糊。 - Marcelo Cantos
谢谢你澄清了这个问题!我已经有一段时间没有使用C++了,显然我的记录有点杂乱无章。 - stiank81
5个回答

26

这是运算符的实现:

    public static bool operator == (String a, String b) {
       return String.Equals(a, b);
    }

不要因此熬夜失眠。


1
现在知道了,这很有用! :-) 无论如何都不会失眠 - 只是想知道是否有最佳实践。 - stiank81

25

我不会使用:

aa.Equals(bb)

除非我 知道 aa 不可能为null,否则我可以使用:

string.Equals(aa,bb)

但如果我想使用特定的StringComparison模式(不变,序数,忽略大小写等),我主要会使用它。虽然我也可能使用StringComparer实现,因为它们比较容易抽象化(例如,将其传递给Dictionary<string, Foo>以获取区分大小写的序数字典)。对于通用性的用途,

a == b

没问题。


2

没有技术上的区别(除非aa为空)。使用你认为更好的方式。在我看来,使用运算符重载可以使代码更清晰。

当你需要额外的参数时(如CompareTo()中),使用函数。


1
从最佳实践的角度来看,我倾向于始终使用Equals()函数进行字符串比较。这样做可以清楚地表明您特别想要比较字符串,当其他人阅读您的代码时也能够理解。

3
与直接比较对象引用不同。 - Steve De Caux

-3
一般来说, == 检查指针是否相等,而.equals检查属性是否相等。 因此,如果您执行了类似以下的操作
a = 'a';
b = 'a';
bool c = (a == b);
bool d = (a.Equals(b))

那么c应该返回false,d应该为true。


2
这真的取决于这里的ab是什么类型。如果它们是string,它就不会编译。如果它们是char,它将会是两次true。如果它们是object,它将会是false/true。但是这些都不完全符合问题(你还需要注意编译器的内部处理)。 - Marc Gravell
并不一定,因为.NET使用字符串内部化,这意味着在底层它们实际上可能是相同的字符串。 - RCIX
@RCIX - 这只适用于 string a = "a"; string b = "a";,但是我同意。 - Marc Gravell
@RCIX - 或者更重要的是,object a = "a"; object b = "a"; - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接