Здравствуйте,
Вот смотрю в рефлекторе код:
public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
{
...
public static bool operator ==(string a, string b)
{
return Equals(a, b);
}
public static bool Equals(string a, string b)
{
return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}
...
}
Сразу первая мысль — почему не происходит зацикливание?
Ну, заподозрил что рефлектор что-то не так декомпилирует, смотрю IL:
.method public hidebysig static bool Equals(string a, string b) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldarg.1
L_0002: bne.un.s L_0006
L_0004: ldc.i4.1
L_0005: ret
L_0006: ldarg.0
...
}
Как видим сначала ссылки на строки кладутся в стек, а потом вызывается опкод bne.un.s который производит прыжок на L_0006 в случае если 2 unsigned integer'а в стеке не равны.
Стало интересно как это выглядит в исходниках на самом деле, скачал:
// Determines whether two Strings match.
public static bool Equals(String a, String b) {
if ((Object)a==(Object)b) {
return true;
}
if ((Object)a==null || (Object)b==null) {
return false;
}
return EqualsHelper(a, b);
}
Вот такие вот дела
Может кому интересно будет.