.NET中的对象相等性行为不同

Bar*_*ğlu 6 .net c#

我有这些陈述,他们的结果就在他们附近.

string a = "abc";
string b = "abc";

Console.Writeline(a == b); //true

object x = a;
object y = b;

Console.Writeline(x == y); // true

string c = new string(new char[] {'a','b','c'});
string d = new string(new char[] {'a','b','c'});

Console.Writeline(c == d); // true

object k = c;
object m = d;

Console.Writeline(k.Equals(m)) //true

Console.Writeline(k == m); // false
Run Code Online (Sandbox Code Playgroud)

为什么最后的平等给我假?

问题是为什么(x == y)为真(k == m)为假

Ode*_*ded 10

对于字符串,==当使用object引用相等时,运算符被重载以测试值相等性.

由于cd 字符串,当您Equalsk和中使用时,使用m重载方法.

c == dtrue为原因状态高于-值平等上使用string作为操作符被重载类型.

  • @Oded,string interning适用于`string`文字.字符串`c`和`d`不使用interned字符串,因为它们不是从文字创建的. (4认同)
  • @Ryu - 如果这就是你想问的问题,为什么不呢? (2认同)

Bob*_*hiv 8

string a = "abc"; 
string b = "abc"; 

Console.Writeline(a == b); //true 
Run Code Online (Sandbox Code Playgroud)

由于String Interning,字符串引用对于相同的字符串是相同的

object x = a; 
object y = b; 

Console.Writeline(x == y); // true 
Run Code Online (Sandbox Code Playgroud)

因为引用是相同的,所以从同一引用创建的两个对象也是相同的.

string c = new string(new char[] {'a','b','c'}); 
string d = new string(new char[] {'a','b','c'}); 
Run Code Online (Sandbox Code Playgroud)

在这里创建两个新的字符数组,这些引用是不同的.

Console.Writeline(c == d); // true 
Run Code Online (Sandbox Code Playgroud)

字符串重载==按值进行比较.

object k = c; 
object m = d; 
Run Code Online (Sandbox Code Playgroud)

由于先前的引用不同,因此这些对象是不同的.

Console.Writeline(k.Equals(m)) //true 
Run Code Online (Sandbox Code Playgroud)

.Equals使用重载的String equals方法,再次按值进行比较

Console.Writeline(k == m); // false 
Run Code Online (Sandbox Code Playgroud)

在这里,我们检查两个引用是否相同......它们不是

关键是确定何时相等性比较参考或值.

除非另有重载,否则对象将比较引用.

除非重载,否则结构将比较值.