А более общо — бывает необходимость работать с данными разной степени валидности, и в этом случае полезно иметь отдельно структуры данных и их валидаторы.
В общем случае, валидация может предполагать соответствие каким-либо внешним данным, и потому принципиально не может быть выражена системой типов. Тем не менее, декларировать работу с данными, прошедшими валидацию, довольно просто.
abstract class Validated<T> {
public T Value;
public Validated(T value) {
if (!IsValid(value)) throw new Exception("Not valid");
Value = value;
}
public abstract bool IsValid(T value);
}
class Int42Validated : Validated<int> {
public Int42Validated(int value) : base(value) { }
public override bool IsValid(int value) {
return value==42;
}
}
void Foo(Int42Validated arg) { }
Ну что ж, я хотел написать решение с async/await, для сравнения, но обнаружил, что этот функционал доступен только начиная с .NET 4.5. Мы же продолжаем писать под 3.5. И пока все работает, решение о переходе на следующую версию рантайма принято не будет.
А более общо — бывает необходимость работать с данными разной степени валидности, и в этом случае полезно иметь отдельно структуры данных и их валидаторы.
А если так:
bool IsValid(int value) {
return value==(int)DateTime.Now.DayOfWeek;
}
В общем случае, валидация может предполагать соответствие каким-либо внешним данным, и потому принципиально не может быть выражена системой типов. Тем не менее, декларировать работу с данными, прошедшими валидацию, довольно просто.
Пойду прыгать с парашютом в продакшен.
не используются скобки и запятые, экономятся нажатия пальцев!