Почему перегрузки оператора не используются чаще? - PullRequest
3 голосов
/ 20 января 2010

Во многих случаях операторские перегрузки позволяют лучше выразить себя. Почему они почти не используются в C #?

Ответы [ 5 ]

11 голосов
/ 20 января 2010

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

Чтобы использовать пример, который вы сейчас предоставили в комментариях к своему вопросу, «+» может показаться достойным способом помещения дочерних элементов в родительский элемент, но операции имеют совершенно другую семантику. «+» предполагает, что вы сложите их математически, когда на самом деле вы стремитесь к иерархическим отношениям между ними. Это может иметь смысл для вас, но я полагаю, что при первом прочтении это, вероятно, не очевидно для многих программистов.

Они редко используются, потому что они редко подходят.

6 голосов
/ 20 января 2010

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

Из-за этого невозможно четко указать, для чего конкретно предназначена перегрузка. Например, в перегрузке оператора сравнения строка! = Нет пробела, чтобы указать, сравнивает ли она длину, выполняет ли посимвольное сравнение без учета регистра или ищет значения в статическом индексированном массиве и сравнивает их (хотя это смешной пример).

1 голос
/ 11 ноября 2010

С http://msdn.microsoft.com/en-us/library/a1sway8w.aspx:

Пользовательские типы могут перегружать оператор << (см. Оператор); </strong> тип первого операнда должен быть пользовательским типом, а тип второго операнда должен быть int. Когда бинарный оператор перегружен, соответствующий оператор присваивания, если таковой имеется, также неявно перегружен.

0 голосов
/ 22 марта 2010

Другая большая проблема, связанная с перегрузкой операторов в .Net, заключается в том, что вы не можете перегрузить всех операторов.Например, операторы << или >> доступны для заметки.А также некоторые другие, которые в некоторых интенсивно используемых классах C ++ не могут быть перегружены.

Так что в большинстве сценариев это не имеет смысла, потому что у вас нет доступа ко всем операторам, к сожалению.1005 *

0 голосов
/ 20 января 2010

Я вижу, что они используются в разных языках, что упрощает создание DSL (доменных языков).
Хорошим примером является PEG , который использует закрытие нотации BNF: здесь использование операторов вполне естественно и выразительно.
Библиотека Lpeg для Lua и модуль PEG Нимрода используют эту возможность, среди прочего, я полагаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...