Я согласен с идеей сделать примитивные типы значений .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
, и Length
в основном являются double
, но дополняют его определенным значением. Если вы определили метод, такой как & hellip;
Area CalculateAreaOfRectangleWith(Length width, Length height)
& hellip; невозможно было бы напрямую перейти в Area
случайно. Пока все хорошо.
НО: Вы можете легко обойти эту явно улучшенную безопасность типов, просто приведя Area
к double
или временно сохранив Area
в переменной double
, а затем передав что в метод, где ожидается Length
:
Area a = 10.0;
double aWithEvilPowers = a;
… = CalculateAreaOfRectangleWith( (double)a, aWithEvilPowers );
Вопрос: Кто-нибудь здесь имеет опыт широкого использования таких пользовательских struct
типов в реальном / производственном программном обеспечении? Если так:
Приносит ли когда-либо перенос типов примитивных значений в пользовательские struct
s непосредственно меньше ошибок, или более поддерживаемый код, или дает какие-либо другие основные преимущества?
Или преимущества пользовательских struct
s слишком малы, чтобы их можно было использовать на практике?
P.S .: Прошло около 5 лет с тех пор, как я задал этот вопрос. Я публикую некоторые из моих опытов, которые я сделал с тех пор как отдельный ответ.