C#中"=="和 Equals()的区别

26 浏览
0 Comments

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日
0
0 Comments

当将一个对象引用和一个字符串(即使对象引用是指向字符串的)进行比较时,字符串类特定的 == 运算符的特殊行为将被忽略。

通常情况下(不涉及字符串的情况下),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
0
0 Comments

==用于类型为object的表达式时,它将解析为System.Object.ReferenceEquals

Equals只是一个virtual方法,并按照此方式运行,因此将使用已覆盖的版本(对于string类型,它会比较内容)。

0