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 () - это ...
true, если этот экземпляри sb имеют одинаковые значения string, Capacity и MaxCapacity;в противном случае false.
object.Equals () использует static Equals (), определенный для объекта , который проверяет только на равенство ссылок (если передан класс) или на равенство значений (если передано структура).
Итак, в итоге
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)