Тип String: Operator == и Equals()

Тема в разделе ".NET", создана пользователем Glucklich, 20 май 2008.

  1. Glucklich

    Glucklich Гость

    Если посмотреть в реализацию оператора == типа String можно увидеть следующее:

    Код (Text):
    public static bool operator ==(string a, string b)
    {
    return Equals(a, b);
    }
    Реализация Equals следующая:

    Код (Text):
    public static bool Equals(string a, string b)
    {
    return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
    }
    Видно, что внутри присутстсвует оператор ==.
    Так вот почему не происходит зацикливаение?

    В моем примере кидает исключение StackOverflowException:

    Код (Text):
    class Class1
    {
    public static bool operator ==(Class1 a, Class1 b)
    {
    return Equals(a, b);
    }

    public static bool operator !=(Class1 a, Class1 b)
    {
    return !Equals(a, b);
    }

    public static bool Equals(Class1 a, Class1 b)
    {
    return ((a == b) || ((a != null) && (b != null)));
    }
    }
    Ну и где-то вызов:

    Код (Text):
    private void button1_Click(object sender, EventArgs e)
    {
    Class1 a = new Class1();
    Class1 b = new Class1();
    MessageBox.Show((a == b).ToString());
    }
    В чем прикол?
     
  2. mr_ST

    mr_ST Гость

    Обрати внимание что в коде восстановленном рефлектором нет никакого оператора ==, есть только public static bool op_Equality(string a, string b ). То бишь, вот здесь return ((a == b ) || (((a != null) && (b != null)) && EqualsHelper(a, b ))); происходит сравнение референсов, а не вызов оператора сравнения.
     
  3. Glucklich

    Glucklich Гость

    Понимаю куда вы клоните, однако, как в приведенном мной примере добиться того же результата. Рефлектор восстанавливает точно такой же код как в случае и со String
     
  4. mr_ST

    mr_ST Гость

    Вместо == используйте object.ReferenceEquals(a, b );
     
  5. Glucklich

    Glucklich Гость

    Так а как же тогда работает во фреймворке?
     
  6. Pasha

    Pasha Гость

    Glucklich
    Это ошибка в рефлекторе. Код сравнения в String.Equals примерно такой:
    Код (Text):
        L_0000: ldarg.0
    L_0001: ldarg.1
    L_0002: bne.un.s L_0006
    - тупое сравнение двух unsigned integer.
    При компиляции твоего кода получается что-то вроде
    Код (Text):
        L_0001: ldarg.0
    L_0002: ldarg.1
    L_0003: call bool ClassLibrary2.Class1::op_Equality(class ClassLibrary2.Class1, class ClassLibrary2.Class1)
    - Вызов оператора. Оба случая рефлектор показывает как ==.
     
  7. mr_ST

    mr_ST Гость

    Это проблема рефлектора а не фреймворка.
     
  8. Glucklich

    Glucklich Гость

    Интересно, сколько еще там глюков?
     
Загрузка...

Поделиться этой страницей