Это необходимый для переопределения == и! = операторы при переопределении Равняются методу? (.NET)

Я настоятельно рекомендую Java для межплатформенной разработки GUI. В частности, я рекомендую разработчику GUI, который идет Netbeans IDE. Это очень просто и очень мощно. Можно указать и перетащить и отбросить, чтобы создать GUI, и легко настроить меры, которые принимают различные кнопки и другие компоненты.

я очень предпочитаю Python как язык, но ни один из бесплатных инструментов для разработки GUI не прибывает никуда близко к этому, и то же самое, кажется, верно для других языков, которые я использовал. (Я должен указать, что QT имеет замечательных разработчиков GUI для различных языков, таких как C и Python, но это только свободно, когда используется на проектах с открытым исходным кодом.)

РЕДАКТИРОВАНИЕ: QT недавно повторно лицензировался как LGPL, таким образом, Вы свободны использовать его в коммерческом применении. Привязка Python для этого (PyQT) не повторно лицензировалась, но другой проект, названный , PySide был создан для обеспечения привязки QT Python.

10
задан Jon Seigel 8 April 2010 в 03:24
поделиться

9 ответов

См. рекомендации по переопределению Equals () и operator == .

Цитата:

По умолчанию оператор == проверяет ссылочное равенство путем определения указывают ли две ссылки на один и тот же объект. Следовательно, ссылочные типы не должны реализовывать operator ==, чтобы получить эту функциональность. Когда тип неизменяемый, то есть данные, содержащиеся в экземпляре, не могут быть изменены, может быть полезен оператор перегрузки == для сравнения равенства значений вместо ссылочного равенства, потому что, как неизменяемые объекты, они могут считаться такими же, как и long поскольку они имеют одинаковую ценность. Не рекомендуется переопределять оператор == в неизменяемых типах.

Обычно:

Если вы хотите, чтобы == и! = Вели себя как Equals (..) и ]! Equals (..) вам необходимо реализовать операторы.

26
ответ дан 3 December 2019 в 13:56
поделиться

См. Рекомендации по реализации равенства и оператора равенства (==)

Для типов значений (структур) «Реализуйте == каждый раз, когда вы переопределяете метод Equals»

Для ссылочных типов (классов): «Большинство ссылочных типов, даже те, которые реализуют метод Equals, не должны переопределять ==. " Исключение составляют неизменяемые классы и классы с семантикой, подобной значению.

5
ответ дан 3 December 2019 в 13:56
поделиться

Если вы переопределив метод equals и все еще желая иметь возможность проверять равенство (или неравенство), вам, вероятно, также следует переопределить методы == и! =.

1
ответ дан 3 December 2019 в 13:56
поделиться

Было бы желательно, поскольку было бы неожиданно, если бы:

if (foo == bar)

... вел себя иначе, чем:

if (foo.Equals(bar))
1
ответ дан 3 December 2019 в 13:56
поделиться

Это не обязательно, никто не убьет вас, если вы этого не сделаете.

Однако заметьте, что часто более естественно написать (A == B), чем A.Equals (B). Если вы предоставите оба метода, потребителям вашего кода будет проще.

1
ответ дан 3 December 2019 в 13:56
поделиться

В дополнение ко всем ответам, которые уже здесь, не забудьте убедиться, что GetHashCode () также согласован.

2
ответ дан 3 December 2019 в 13:56
поделиться

Это не обязательно, но умный поступок.

Если вы создаете фреймворк и другой разработчик, кроме вас, собираетесь использовать объект, вы должны переопределить == и! =. Таким образом, когда разработчик может его использовать, у него, по крайней мере, будет правильная логика для сравнения двух объектов, а не просто одинаковых в памяти.

Я бы позаботился о том, чтобы ваш == &! = Действительно вызывал ваш метод equals.

1
ответ дан 3 December 2019 в 13:56
поделиться

в A. Equals (B) A не может быть нулевым в A == B любое значение может быть нулевым

1
ответ дан 3 December 2019 в 13:56
поделиться

Переопределение == для вызова Equals кажется мне в целом плохой идеей для ссылочных типов. Если вы переопределите ==, чтобы он вызывал Equals, я не думаю, что у пользователя вашего кода есть способ проверить, ссылаются ли две объектные ссылки на один и тот же объект (по сравнению с объектом с одинаковыми свойствами).

Если люди хотят протестировать экземпляры ваших классов на равенство значений, тогда им, конечно же, следует просто вызвать Equals, сохранив == специально для проверки эталонного равенства.

1
ответ дан 3 December 2019 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: