Удобство?
Более или менее да.Рассмотрим случай, когда у вас есть числовой объект (скажем, Complex
), для которого вы выполняете вычисления.Ясно, что написание кода, такого как:
Complex result = c1 * new Complex(2) + new Complex(32);
, очень раздражает и его трудно читать.Здесь помогают неявные преобразования (альтернативой могут быть перегрузки операторов в этом примере, но это приведет к множеству подобных перегрузок).
Есть ли для этого рекомендации?
Предоставьте как можно меньше неявных преобразований, поскольку они могут скрывать проблемы.Неявное преобразование уменьшает явность на ту же величину, на которую они увеличивают краткость.Иногда это хорошо, но иногда нет.
Я считаю, что лучше всего ограничить неявные преобразования очень подобными типами, такими как числовые объекты в моем примере выше: int
по сути, это -1020 * (с математической точки зрения; даже если оно не моделируется с помощью наследования), следовательно, неявное преобразование имеет смысл.
В 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);
}
}
Конечно, эффективна ли эта микрооптимизация - это другой вопрос.