Следующий пример явно вымышленный, но он возобновляет выполнение проверки на базе кода, с которой я работаю.
В TypeA есть два метода со следующими сигнатурами:
public void FirstMethod(TypeB param)
public ValidationResult TryFirstMethod(TypeB param)
Когда вызывается FirstMethod, он должен выполнить проверку параметра.
Следовательно, он вызывает TryFirstMethod для получения объекта, представляющего результат проверки.
Если экземпляр ValidationResult сообщает, что все в порядке, выполнение продолжается, иначе выдается исключение.
Утилита TryFirstMethod заключается в том, что вызывающий объект, гипотетический TypeC, может выполнить этот метод и проверить, будет ли генерироваться фактический метод. Изучив свойство в ValidationResult.
Кроме того, экземпляр ValidationResult содержит информацию о том, почему ввод был неверным, как его исправить и т. Д.
Это оправдывает необходимость использования этого типа вместо, скажем, использования логического значения.
На практике это работает довольно хорошо, довольно просто проверять данные и возвращать локализованные сообщения об ошибках пользователю.
Единственная проблема заключается в том, что, поскольку некоторые проверки довольно сложны, их выполнение два раза становится немного дороже.
Изначально они выполняются вызывающей стороной, чтобы убедиться, что фактический метод не сгенерирует.
И затем снова с помощью рассматриваемого метода, чтобы проверить, что ввод действителен.
Я не могу найти чистый способ избежать проверки два раза.
Чтобы сделать вещи более сложными, существует тот факт, что решение должно работать со стандартными методами, конструкторами, а также когда TypeB является «примитивным» типом, таким как string или int.