c# - 为什么 object.Equals 和 instanceobject.Equals 不一样

标签 c# string stringbuilder

        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/

相关文章:

java - 在给定情况下使用 StringBuilder 构建字符串的最佳实践是什么?

r - 在 R 中查找长字符串中的第一个匹配子字符串

java - 如何从特定结构的txt文件中获取试题?

c# - xamarin 广播接收器访问 View 模型

c# - 在 View : An exception of type 'System.InvalidOperationException' occurred in System. Web.Mvc.dll 中使用 2 个模块,但未在用户代码中处理

c - c 中的 TCP 聊天无法正确读取/发送字符串

c - 如何从csv文件中获取特定行?

java - 在字符串之间添加 n-1 个逗号

c# - .net 代码的可读性和可维护性

c# - 使用 envDTE 以编程方式安装 nupkg