Удобство?
Больше или меньше, да. Рассмотрим случай, когда у вас есть числовой объект (скажем, Complex
), на котором вы выполняете вычисления. Очевидно, что код записи, такой как:
Complex result = c1 * new Complex(2) + new Complex(32);
очень раздражает и трудно читается. Здесь подразумеваются неявные преобразования (альтернативой может быть перегрузка операторов в этом примере, но это приведет к множеству подобных перегрузок).
Есть ли руководство для этого?
Предоставьте как можно меньше имплицитных преобразований, поскольку они могут скрыть проблемы. Неявное преобразование уменьшает очевидность на ту же сумму, с которой они увеличивают терпение. Иногда это хорошо, но иногда нет.
Я считаю, что лучше всего ограничить неявные преобразования для самых подобных типов, таких как количество подобных объектов в моем примере выше: int
по существу является разновидностью Complex
(с математической точки зрения, даже если она не моделируется с помощью наследование), поэтому неявное преобразование имеет смысл.
В VB, неявное преобразование называется «Widening
» (в отличие от Narrowing
, который explicit
), и это описывает его так: никакая информация не теряется в процессе преобразования.
Кроме того, оператор по существу является функцией построения и имеет (некоторые) обычные преимущества функции-строителя над конструктором: а именно, он может повторно использовать кешированные значения, а не всегда создавать новые экземпляры.
Рассмотрите мой пример Complex
. Мы можем захотеть кэшировать значения для часто используемых комплексных номеров:
Class Complex {
// Rest of implementation.
private static Complex[] cache = new[] {
new Complex(-1), new Complex(0), new Complex(1) };
public implicit operator Complex(int value) {
if (value >= -1 && value <= 1)
return cache[value];
else
return new Complex(value);
}
}
Конечно, вопрос о том, является ли эта микро-оптимизация эффективной, является еще одним вопросом.
Спасибо, как бы вы сделали это для перегрузок операторов, которые помогли бы сложному типу? Вы должны иметь возможность редактировать тип int, правильно? –
@Joan: Нет, поскольку вы можете реализовать операторов в обоих направлениях: * от * вашего пользовательского типа и * до * вашего настраиваемого типа. В моем примере просто «Complex» реализует оператор 'implicit operator Complex (int value)'. –
Спасибо, я понял. –