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