Оператор, перегружающийся в.NET

Для веб-разработки Вы могли бы хотеть взглянуть на hunchentoot, веб-сервер, записанный в языке Common LISP.

11
задан DavidRR 29 September 2015 в 12:19
поделиться

5 ответов

  • Я настоятельно рекомендую перегрузить == и! = Везде, где я отменяю Равно
  • Я бы рассмотрел (гораздо менее сильно) перегрузку операторов сравнения везде, где я реализую IComparable
  • Я бы подумал о перегрузке арифметических операторов для принципиально числовых типов
  • Я бы подумал о предоставлении явных преобразований для типов "оберток" (например, Nullable )
  • Я бы очень редко рассматривал возможность предоставления неявных преобразований

Золотое правило не для перегрузки операторов, если смысл не совсем очевиден. Например, я думаю, что было бы довольно странно иметь оператор + в Stream - это могло бы означать «сделать записываемый T здесь, чтобы запись результата записывалась в оба» или это могло означать «читать один за другим "или, возможно, другие вещи.

По моему опыту, довольно редко можно перегружать что-либо, кроме == и! =.

17
ответ дан 3 December 2019 в 01:24
поделиться

Я думаю, что Руководство по проектированию фреймворка дает хороший совет:

  • ИЗБЕГАЙТЕ определения перегрузок операторов, за исключением типов, которые должны выглядеть как примитивные (встроенные) типы.
  • РАССМАТРИВАЙТЕ определение перегрузок операторов в типе, который должен ощущаться как примитивный тип.
  • ОБЯЗАТЕЛЬНО определяют перегрузки операторов в структурах, представляющих числа (например, System.Decimal).
  • НЕ СОБИРАЙТЕСЬ при определении перегрузок оператора.
  • НЕ предоставляйте перегрузки оператора, если хотя бы один из операндов не относится к типу, определяющему перегрузку.
  • DO перегрузить операторы симметричным образом.
  • РАССМАТРИВАЙТЕ предоставление методов с понятными именами, соответствующими каждый перегруженный оператор.
16
ответ дан 3 December 2019 в 01:24
поделиться

Я рассматриваю переопределяющие операторы в следующих случаях:

  • == и! =, Когда это простой тип значения, и реализую сравнение значений. В других типах я ожидаю, что эталонное сравнение == и! = So также не требует больших затрат.
  • операторы сравнения (>,> = и т.д.) в том же случае, что и выше, если это просто числовое значение.
  • На самом деле я никогда не перегружаю аритметические операторы, но сделал бы это для того же типа числовых значений, если бы это повысило удобство использования.
  • операторы преобразования, если тип может быть преобразован без потерь в соответствующий другой тип.
3
ответ дан 3 December 2019 в 01:24
поделиться

Я бы подумал использование перегрузки оператора для арифметических операций с типами, представляющими логическое значение. Например, были случаи, когда мне хотелось, чтобы Точка имела перегрузку для операторов + и - .

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

Я просил закрыть это, но, возможно, он может остаться открытым (я пытался передумать, но, видимо, вы не можете отозвать запрос на закрытие: P)

Я отвечу лично : never .

Я никогда не думаю, что реализовать перегрузку операторов - хорошая идея. Есть только одно исключение: если я пишу какую-то коллекцию (это случается не очень часто) и хочу реализовать индексаторы [].

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

3
ответ дан 3 December 2019 в 01:24
поделиться