Я играю с идеей сделать примитивные типы значений .NET более типобезопасными и более «самодокументированными», заключив их в пользовательские ] struct
s. Тем не менее, мне интересно, стоит ли это когда-нибудь в реальном программном обеспечении.
(Эти «усилия» можно увидеть ниже: необходимость многократно применять один и тот же шаблон кода. Мы заявляем
struct
s и поэтому не может использовать наследование для удаления повторения кода, а поскольку перегруженные операторы должны быть объявленыstatic
, они должны быть определены для каждого типа отдельно.)
Возьмите это (правда, тривиально ) пример:
struct Area
{
public static implicit operator Area(double x) { return new Area(x); }
public static implicit operator double(Area area) { return area.x; }
private Area(double x) { this.x = x; }
private readonly double x;
}
struct Length
{
public static implicit operator Length(double x) { return new Length(x); }
public static implicit operator double(Length length) { return length.x; }
private Length(double x) { this.x = x; }
private readonly double x;
}
И Область
, и Длина
в основном двойные
, но дополняют их определенным значением. Если вы определили такой метод, как…
Area CalculateAreaOfRectangleWith(Length width, Length height)
…, было бы невозможно напрямую пройти в Area
случайно. Пока все хорошо.
НО: Вы можете легко обойти эту явно улучшенную безопасность типов, просто преобразовав Area
в double
или временно сохранив Область
в двойной
переменной, а затем передача ее в метод, где ожидается Длина
:
Area a = 10.0;
double aWithEvilPowers = a;
… = CalculateAreaOfRectangleWith( (double)a, aWithEvilPowers );
Вопрос: Есть ли у кого-нибудь здесь опыт широкого использования таких пользовательских типов struct
в реальном / производственном программном обеспечении? Если да:
Приводило ли обертывание примитивных типов значений в пользовательские структуры struct
напрямую к меньшему количеству ошибок, или к более удобному для сопровождения коду, или давало ли какие-либо другие важные преимущества?
Или преимущества пользовательских struct
слишком малы для использования на практике?
PS: Прошло около 5 лет с тех пор, как я задал этот вопрос. Я отправляю некоторые из моих опытов, полученных с тех пор , в виде отдельного ответа.