Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )


> Тип String: Operator == и Equals()
Glucklich
Вставить ник
сообщение 20:05:2008, 09:34
Цитата Ответить 


Новенький
Иконка группы

Группа: Программист
Сообщений: 25
Регистрация: 17:05:2008
Пользователь №: 17 354



Репутация:   0  


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

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


Реализация Equals следующая:

public static bool Equals(string a, string b)
{
    return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}


Видно, что внутри присутстсвует оператор ==.
Так вот почему не происходит зацикливаение?

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

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


Ну и где-то вызов:

private void button1_Click(object sender, EventArgs e)
    {
        Class1 a = new Class1();
        Class1 b = new Class1();
        MessageBox.Show((a == b).ToString());
    }


В чем прикол?
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 7)
mr_ST
Вставить ник
сообщение 20:05:2008, 09:55
Цитата Ответить 


Новенький
Иконка группы

Группа: .NET UG team
Сообщений: 86
Регистрация: 9:03:2006
Пользователь №: 3 049



Репутация:   0  


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

Сообщение отредактировал mr_ST - 20:05:2008, 10:37
Подняться вверх 
 
Сообщение #2
Glucklich
Вставить ник
сообщение 20:05:2008, 10:14
Цитата Ответить 


Новенький
Иконка группы

Группа: Программист
Сообщений: 25
Регистрация: 17:05:2008
Пользователь №: 17 354



Репутация:   0  


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

Сообщение отредактировал Glucklich - 20:05:2008, 10:17
Подняться вверх 
 
Сообщение #3
mr_ST
Вставить ник
сообщение 20:05:2008, 10:40
Цитата Ответить 


Новенький
Иконка группы

Группа: .NET UG team
Сообщений: 86
Регистрация: 9:03:2006
Пользователь №: 3 049



Репутация:   0  


Цитата(Glucklich @ 20:05:2008, 12:14 ) *
Понимаю куда вы клоните, однако, как в приведенном мной примере добиться того же результата. Рефлектор восстанавливает точно такой же код как в случае и со String


Вместо == используйте object.ReferenceEquals(a, b );
Подняться вверх 
 
Сообщение #4
Glucklich
Вставить ник
сообщение 20:05:2008, 12:20
Цитата Ответить 


Новенький
Иконка группы

Группа: Программист
Сообщений: 25
Регистрация: 17:05:2008
Пользователь №: 17 354



Репутация:   0  


Цитата(mr_ST @ 20:05:2008 - 11:40) *
Вместо == используйте object.ReferenceEquals(a, b );


Так а как же тогда работает во фреймворке?
Подняться вверх 
 
Сообщение #5
Pasha
Вставить ник
сообщение 20:05:2008, 13:19
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 1 293
Регистрация: 17:05:2006
Из: Минск
Пользователь №: 4 257



Репутация:   29  


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


Новенький
Иконка группы

Группа: .NET UG team
Сообщений: 86
Регистрация: 9:03:2006
Пользователь №: 3 049



Репутация:   0  


Цитата(Glucklich @ 20:05:2008, 14:20 ) *
Так а как же тогда работает во фреймворке?


Это проблема рефлектора а не фреймворка.
Подняться вверх 
 
Сообщение #7
Glucklich
Вставить ник
сообщение 20:05:2008, 14:44
Цитата Ответить 


Новенький
Иконка группы

Группа: Программист
Сообщений: 25
Регистрация: 17:05:2008
Пользователь №: 17 354



Репутация:   0  


Интересно, сколько еще там глюков?
Подняться вверх 
 
Сообщение #8


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись |  AJAX?
   

 

RSS Текстовая версия Сейчас: 8:01:2009 - 23:15

с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net
Модульные здания и строительные бытовки; печать на cd тиражирование; Система автоматической записи телефонных разговоров