Pri*_*kar 8 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
Run Code Online (Sandbox Code Playgroud)
这里返回相同的结果.现在,当我使用StringBuilder时,它没有返回相同的值.底层的原因是什么?
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder();
Console.WriteLine(s1.Equals(s2)); // returning true
Console.WriteLine(object.Equals(s1, s2)); // returning false
Run Code Online (Sandbox Code Playgroud)
编辑1:我的上述问题在下面回答.但在本次讨论中,我们发现StringBuilder在其实现中没有任何覆盖Equals方法.所以当我们调用StringBuilder.Equals时,实际上它会转到Object.Equals.因此,如果有人调用StringBuilder.Equals和S1.Equals(S2),结果将会有所不同.
String.Equals()在C#中被覆盖,以便在使用定义Equal()的Equal()覆盖时实际上是相同的字符串string.
如果你正在比较字符串文字(在你的例子中不是这种情况),值得注意的是相同的字符串文字是被实现的 ......也就是说,相同的字符串存在于同一个地址,因此也将通过引用相等(例如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()是......
如果此实例和sb具有相等的字符串,容量和MaxCapacity值,则返回true;否则返回false.否则,错误.
object.Equals()使用在对象上定义的静态Equals(),它仅检查引用相等性(如果传递一个类)或值相等(如果传递一个struct).
所以总结一下
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)
Run Code Online (Sandbox Code Playgroud)