Верить ли рефлектору?!? ;)
От: MozgC США http://nightcoder.livejournal.com
Дата: 08.07.09 12:19
Оценка: 10 (1)
Здравствуйте,

Вот смотрю в рефлекторе код:

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);
        }

Вот такие вот дела Может кому интересно будет.
Re: Верить ли рефлектору?!? ;)
От: Mr.Cat  
Дата: 08.07.09 12:25
Оценка:
Здравствуйте, MozgC, Вы писали:
MC> public static bool Equals(string a, string b)
MC> {
MC> return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
MC> }

Да, похоже, рефлектор забыл привести a и b к Object перед тем, как сравнивать оператором ==.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.