Багодром: Реализация операторов сравнения
От: Чистяков Влад (VladD2) Российская Империя www.nemerle.org
Дата: 15.03.08 13:47
Оценка: 1192 (31) +1 -1 :)))
Статья:
Багодром: Реализация операторов сравнения
Автор(ы): Чистяков Влад (VladD2)
Дата: 15.03.2008
Данная статья посвящена вопросу грамотной реализации операторов сравнения. При кажущейся простоте, эта задача несет в себе ряд скрытых трудностей. Реализация операторов сравнения нередко приводит к появлению неприятных ошибок. В основном эта информация касается C#-программистов, но будет полезна тем, кто пишет .NET-код и на других языках.


Авторы:
Чистяков Влад (VladD2)

Аннотация:
Данная статья посвящена вопросу грамотной реализации операторов сравнения. При кажущейся простоте, эта задача несет в себе ряд скрытых трудностей. Реализация операторов сравнения нередко приводит к появлению неприятных ошибок. В основном эта информация касается C#-программистов, но будет полезна тем, кто пишет .NET-код и на других языках.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Багодром: Реализация операторов сравнения
От: Othello  
Дата: 19.03.08 08:06
Оценка:
А почему нету в новостях. Или хотябы в статьях.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Багодром: Реализация операторов сравнения
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 19.03.08 08:17
Оценка:
Здравствуйте, Othello, Вы писали:

O>А почему нету в новостях. Или хотябы в статьях.


потому что это не статья, а анонс
... << RSDN@Home 1.2.0 alpha 3 rev. 948>>
Re[3]: Багодром: Реализация операторов сравнения
От: Othello  
Дата: 19.03.08 08:32
Оценка:
OE>потому что это не статья, а анонс

Статья:
Багодром: Реализация операторов сравнения

написано же — статья

а раздела — анонсы нету — где их все посмотреть ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Багодром: Реализация операторов сравнения
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 19.03.08 10:32
Оценка:
Здравствуйте, Othello, Вы писали:

O>а раздела — анонсы нету — где их все посмотреть ?


как и написано в новостях — http://rsdn.ru/summary/4688.xml
... << RSDN@Home 1.2.0 alpha 3 rev. 948>>
Re: Багодром: Реализация операторов сравнения
От: vdimas Россия  
Дата: 27.03.08 15:21
Оценка: 1 (1) +2
Здравствуйте, Чистяков Влад (VladD2), Вы писали:

Кстати, меня весьма раздражает тот факт, что если я переопределил операторы == и !=, то простая проверка:
if(myObj!=null)

приводит к вызову кучи кода, вместо того, чтобы просто заэммитить в байткод проверку на null.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re: Багодром: Реализация операторов сравнения
От: anton_t Россия  
Дата: 27.03.08 17:59
Оценка:
Здравствуйте, Чистяков Влад (VladD2), Вы писали:

ЧВV>Статья:

ЧВV>Багодром: Реализация операторов сравнения
Автор(ы): Чистяков Влад (VladD2)
Дата: 15.03.2008
Данная статья посвящена вопросу грамотной реализации операторов сравнения. При кажущейся простоте, эта задача несет в себе ряд скрытых трудностей. Реализация операторов сравнения нередко приводит к появлению неприятных ошибок. В основном эта информация касается C#-программистов, но будет полезна тем, кто пишет .NET-код и на других языках.


ЧВV>Авторы:

ЧВV> Чистяков Влад (VladD2)

ЧВV>Аннотация:

ЧВV>Данная статья посвящена вопросу грамотной реализации операторов сравнения. При кажущейся простоте, эта задача несет в себе ряд скрытых трудностей. Реализация операторов сравнения нередко приводит к появлению неприятных ошибок. В основном эта информация касается C#-программистов, но будет полезна тем, кто пишет .NET-код и на других языках.

Можно ли каким-нибудь образом заказать журнал по интернету? http://rsdn.ru/RsdnMag/Subscribe/OrderPost.aspx который месяц (если не который год) не работает.
Re[2]: Багодром: Реализация операторов сравнения
От: anton_t Россия  
Дата: 31.03.08 02:57
Оценка: +1
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Чистяков Влад (VladD2), Вы писали:


V>Кстати, меня весьма раздражает тот факт, что если я переопределил операторы == и !=, то простая проверка:

V>
V>if(myObj!=null)
V>

V>приводит к вызову кучи кода, вместо того, чтобы просто заэммитить в байткод проверку на null.

Вызывай
!object.ReferenceEquals(myObj, null)

А то ты хочешь странного: я переопределил оператор, но не хочу что бы он переопределялся.
Re[3]: Багодром: Реализация операторов сравнения
От: vdimas Россия  
Дата: 31.03.08 08:55
Оценка: +1
Здравствуйте, anton_t, Вы писали:


_>Вызывай

_>
!object.ReferenceEquals(myObj, null)

_>А то ты хочешь странного: я переопределил оператор, но не хочу что бы он переопределялся.

Что-то я не понял рассуждения, ты хочешь сказать, что может быть еще какая-то семантика проверки ссылочного типа на null?


P.S. в вызове ReferenceEquals специфицировать object не обязательно.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[4]: Багодром: Реализация операторов сравнения
От: _FRED_ Россия
Дата: 31.03.08 09:28
Оценка: 6 (1) +1
Здравствуйте, vdimas, Вы писали:

_>>А то ты хочешь странного: я переопределил оператор, но не хочу что бы он переопределялся.

V>Что-то я не понял рассуждения, ты хочешь сказать, что может быть еще какая-то семантика проверки ссылочного типа на null?

Неоднозначность в предлагаемом тобой подходе в том, что вот такой вот код:
MyRefType myObj2 = null;
if(myObj != myObj2) // "Обычное", определённое в типе сравнение

и такой:
if(myObj != null) // Специальное с null

будут работать совсем по-разному.
... << RSDN@Home 1.2.0 alpha 4 rev. 1048>>
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Багодром: Реализация операторов сравнения
От: vdimas Россия  
Дата: 31.03.08 11:01
Оценка: +1
Здравствуйте, _FRED_, Вы писали:


_FR>Неоднозначность в предлагаемом тобой подходе в том, что вот такой вот код:

_FR>
_FR>MyRefType myObj2 = null;
_FR>if(myObj != myObj2) // "Обычное", определённое в типе сравнение
_FR>

_FR>и такой:
_FR>
_FR>if(myObj != null) // Специальное с null
_FR>

_FR>будут работать совсем по-разному.

Да, в первом случае будет вызван ReferenceEquals, только я не вижу, чтобы это работало совсем по-разному.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[6]: Багодром: Реализация операторов сравнения
От: _FRED_ Россия
Дата: 31.03.08 11:11
Оценка:
Здравствуйте, vdimas, Вы писали:

_FR>>Неоднозначность в предлагаемом тобой подходе в том, что вот такой вот код:

_FR>>MyRefType myObj2 = null;
_FR>>if(myObj != myObj2) // "Обычное", определённое в типе сравнение


V>Да, в первом случае будет вызван ReferenceEquals, только я не вижу, чтобы это работало совсем по-разному.


Нет, если в типе MyRefType переопределён оператор == (а разговор-то именно о переопределении операторов), то в первом случае будет вызван он (считаю, что тип myObj так же MyRefType).
... << RSDN@Home 1.2.0 alpha 4 rev. 1048>>
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Багодром: Реализация операторов сравнения
От: vdimas Россия  
Дата: 31.03.08 12:45
Оценка: +1
Здравствуйте, _FRED_, Вы писали:


_FR>Нет, если в типе MyRefType переопределён оператор == (а разговор-то именно о переопределении операторов), то в первом случае будет вызван он (считаю, что тип myObj так же MyRefType).


Никаких "нет", operator== статический, т.е. тебе всё-равно придётся проверять на null первый аргумент (ссылочного типа, напомню). В общем, разница тут будет только в том случае, если твой operator== содержит баги.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[8]: Багодром: Реализация операторов сравнения
От: _FRED_ Россия
Дата: 31.03.08 14:28
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Никаких "нет", operator== статический, т.е. тебе всё-равно придётся проверять на null первый аргумент (ссылочного типа, напомню). В общем, разница тут будет только в том случае, если твой operator== содержит баги.


Разница в том, что при одних аргументах (переменные) будет выполняться один код, а при других (null) — другой.
... << RSDN@Home 1.2.0 alpha 4 rev. 1048>>
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Багодром: Реализация операторов сравнения
От: anton_t Россия  
Дата: 31.03.08 16:50
Оценка: :)
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, anton_t, Вы писали:



_>>Вызывай

_>>
!object.ReferenceEquals(myObj, null)

_>>А то ты хочешь странного: я переопределил оператор, но не хочу что бы он переопределялся.

V>Что-то я не понял рассуждения, ты хочешь сказать, что может быть еще какая-то семантика проверки ссылочного типа на null?


А почему нет? Зачем создавать искусственные нагромождения правил: если тут null, то будет так-то, а если не null то будет по другому, а по средам ещё как-нибудь.

V>P.S. в вызове ReferenceEquals специфицировать object не обязательно.


Можно, но я предпочитаю писать с object

using System;

namespace ConsoleApplication8
{
    class Program
    {
        public static bool ReferenceEquals(Program p1, Program p2)
        {
            return true;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(ReferenceEquals(new Program(), new Program()));
            Console.WriteLine(object.ReferenceEquals(new Program(), new Program()));
            Console.ReadLine();
        }
    }
}
Re[5]: Багодром: Реализация операторов сравнения
От: _FRED_ Россия
Дата: 31.03.08 17:08
Оценка:
Здравствуйте, anton_t, Вы писали:

V>>P.S. в вызове ReferenceEquals специфицировать object не обязательно.

_>Можно, но я предпочитаю писать с object

Хоть раз в жизни пригодилось? Чем занимался собственный ReferenceEquals?
... << RSDN@Home 1.2.0 alpha 4 rev. 1048>>
Help will always be given at Hogwarts to those who ask for it.
Re[6]: Багодром: Реализация операторов сравнения
От: anton_t Россия  
Дата: 31.03.08 18:24
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, anton_t, Вы писали:


V>>>P.S. в вызове ReferenceEquals специфицировать object не обязательно.

_>>Можно, но я предпочитаю писать с object

_FR>Хоть раз в жизни пригодилось? Чем занимался собственный ReferenceEquals?


Что пригодилось? ReferenceEquals ни разу не переопределял и вам не советую.
Re[7]: Багодром: Реализация операторов сравнения
От: _FRED_ Россия
Дата: 31.03.08 18:33
Оценка:
Здравствуйте, anton_t, Вы писали:

V>>>>P.S. в вызове ReferenceEquals специфицировать object не обязательно.

_>>>Можно, но я предпочитаю писать с object

_FR>>Хоть раз в жизни пригодилось? Чем занимался собственный ReferenceEquals?


_>Что пригодилось? ReferenceEquals ни разу не переопределял и вам не советую.


"писать с object"? Ты сам заявил, почему предпочитаешь "писать с object". Так вот хоть раз в жизни пригодился тот случай, что ты сам в примере привёл?
... << RSDN@Home 1.2.0 alpha 4 rev. 1048>>
Help will always be given at Hogwarts to those who ask for it.
Re[8]: Багодром: Реализация операторов сравнения
От: anton_t Россия  
Дата: 31.03.08 18:39
Оценка: -1
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, anton_t, Вы писали:


V>>>>>P.S. в вызове ReferenceEquals специфицировать object не обязательно.

_>>>>Можно, но я предпочитаю писать с object

_FR>>>Хоть раз в жизни пригодилось? Чем занимался собственный ReferenceEquals?


_>>Что пригодилось? ReferenceEquals ни разу не переопределял и вам не советую.


_FR>"писать с object"? Ты сам заявил, почему предпочитаешь "писать с object". Так вот хоть раз в жизни пригодился тот случай, что ты сам в примере привёл?


Я вообще статические методы стараюсь писать со спецификацией типа, во избежании недоразумений. Если можно легко избежать лишнего бага, зачем его не избегать?
Re[9]: Багодром: Реализация операторов сравнения
От: vdimas Россия  
Дата: 31.03.08 22:39
Оценка:
Здравствуйте, _FRED_, Вы писали:

V>>Никаких "нет", operator== статический, т.е. тебе всё-равно придётся проверять на null первый аргумент (ссылочного типа, напомню). В общем, разница тут будет только в том случае, если твой operator== содержит баги.


_FR>Разница в том, что при одних аргументах (переменные) будет выполняться один код, а при других (null) — другой.


Т.е. можно считать, что аргументы исчерпаны?
... << RSDN@Home 1.2.0 alpha rev. 786>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.