Проверка типов примитивных типов значений .NET с помощью настраиваемых структур: стоит ли это усилий?

Я играю с идеей сделать примитивные типы значений .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 лет с тех пор, как я задал этот вопрос. Я отправляю некоторые из моих опытов, полученных с тех пор , в виде отдельного ответа.

14
задан Community 23 May 2017 в 11:54
поделиться