C#中"=="和 Equals()的区别
C#中"=="和 Equals()的区别
我在一个Silverlight应用程序中有一个条件,它比较了两个字符串,但不知何故,当我使用==
时它返回false,而.Equals()
返回true。
这是代码:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack")) { // Execute code } if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack") { // Execute code }
为什么会发生这种情况?
admin 更改状态以发布 2023年5月21日
当将一个对象引用和一个字符串(即使对象引用是指向字符串的)进行比较时,字符串类特定的 ==
运算符的特殊行为将被忽略。
通常情况下(不涉及字符串的情况下),Equals
比较值,而 ==
比较对象引用。如果你正在比较的两个对象都引用相同的对象实例,那么两者都将返回 true,但如果其中一个具有相同的内容并来自于不同的来源(即是带有相同数据的单独实例),则只有 Equals 将返回 true。然而,正如在注释中所指出的那样,字符串是一个特殊的情况,因为它重写了 ==
运算符,使得当处理纯字符串引用(而不是对象引用)时,即使是单独的实例,只有值被比较。以下代码展示了行为上微妙的差异:
string s1 = "test"; string s2 = "test"; string s3 = "test1".Substring(0, 4); object s4 = s3; // Notice: set to object variable! Console.WriteLine($"{object.ReferenceEquals(s1, s2)} {s1 == s2} {s1.Equals(s2)}"); Console.WriteLine($"{object.ReferenceEquals(s1, s3)} {s1 == s3} {s1.Equals(s3)}"); Console.WriteLine($"{object.ReferenceEquals(s1, s4)} {s1 == s4} {s1.Equals(s4)}");
输出是:
True True True // s1, s2 False True True // s1, s3 False False True // s1, s4
总结:
变量 | .ReferenceEquals | == | .Equals |
---|---|---|---|
s1, s2 | True | True | True |
s1, s3 | False | True | True |
s1, s4 | False | False | True |
当==
用于类型为object
的表达式时,它将解析为System.Object.ReferenceEquals
。
Equals
只是一个virtual
方法,并按照此方式运行,因此将使用已覆盖的版本(对于string
类型,它会比较内容)。