Ситуация
У меня есть класс, который обрабатывает внутри себя много разных типов путей к файлам: некоторые локальные, некоторые удаленные; некоторый относительный, некоторый абсолютный.
Случилось так, что многие из его методов передают их друг другу как string
s, но было очень сложно отслеживать, какой тип пути ожидал каждый метод.
Требуемое исправление
Таким образом, мы по существу хотели typedef
четыре разных типа: string
: RemoteRelative
, LocalRelative
, RemoteAbsolute
и LocalAbsolute
. Таким образом, статический тип проверки может помочь разработчикам убедиться, что они обеспечивают и ожидают string
с правильной семантикой.
К сожалению, string
является sealed
в BCL, поэтому мы не могли сделать это с простым наследованием. И нет простого typedef
, поэтому мы тоже не могли бы сделать это.
Фактическое исправление
В итоге я создал четыре разных простых класса, каждый из которых содержит readonly string
.
public struct LocalAbsolutePath {
public readonly string path;
public LocalAbsolutePath(string path) {
this.path = path;
}
}
В основном это работает, но в итоге он добавляет немного нежелательной многословности.
Вопрос. Могу ли я игнорировать любые альтернативы, которые естественно вписываются в простой синтаксис С#?
Как я уже упоминал выше, здесь будет моя мечта стиль C typedef string LocalAbsolutePath;
или даже стиль F # type LocalAbsolutePath = string
. Но даже то, что шаг в этом направлении из пользовательских классов будет большим.