string s1 = "t";
string s2 = 't'.ToString();
Console.WriteLine(s1.Equals(s2)); // returning true
Console.WriteLine(object.Equals(s1, s2)); // returning true
这里返回相同的结果。现在,当我使用 StringBuilder 时,它不会返回相同的值。背后的原因是什么?
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder();
Console.WriteLine(s1.Equals(s2)); // returning true
Console.WriteLine(object.Equals(s1, s2)); // returning false
Edit1:我上面的问题在下面得到了回答。但是在这次讨论中,我们发现 StringBuilder 在其实现中没有任何重写 Equals 方法。所以当我们调用 StringBuilder.Equals 时,它实际上转到了 Object.Equals。因此,如果有人调用 StringBuilder.Equals 和 S1.Equals(S2),结果将不同。
最佳答案
String.Equals()在 C# 中被覆盖,这样当使用 string
上定义的 Equal()
覆盖时,相同的字符串实际上是 Equal()
。
如果你比较string literals (在你的例子中不是这种情况),值得注意的是相同的字符串文字是 interned ...也就是说,相同的字符串位于相同的地址,因此通过引用(例如 object.Equals() 或 s1.ReferenceEquals(s2))以及值也将相等。
StringBuilder 为 Equals()
提供了一个重载,它将 StringBuilder 作为参数(即 s1.Equals(s2)
将调用该重载而不是调用 object.Equals(object obj)
).
http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.equals.aspx
StringBuilder.Equals() 是...
true if this instance and sb have equal string, Capacity, and MaxCapacity values; otherwise, false.
object.Equals() 使用 static Equals() defined on object ,它只检查引用相等性(如果传递了一个类)或 value equality (如果传递了一个结构)。
总结一下
string s1 = "t";
string s2 = 't'.ToString();
Console.WriteLine(s1.Equals(s2)); // true because both reference equality (interned strings) and value equality (string overrides Equals())
Console.WriteLine(object.Equals(s1, s2)); // true because of reference equality (interned strings)
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder();
Console.WriteLine(s1.Equals(s2)); // true because StringBuilder.Equals() overloaded
Console.WriteLine(object.Equals(s1, s2)); // false because the two StringBuilder instances have different addresses (references not equal)
关于c# - 为什么 object.Equals 和 instanceobject.Equals 不一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9763960/