Ответ 1
Это своего рода сложный запрос, и, честно говоря, он, вероятно, будет отличаться в зависимости от предпочтений больше, чем что-либо еще. Но, здесь мое понимание:
- Производительность. Исключения будут терять почти каждый раз, если ваши другие реализации не будут ужасающими. Там существенные накладные расходы на цикл броска/вылова. (Анекдот: у меня была проверка "должно быть число", которая была исключением, она "отставала" от пользовательского интерфейса в течение заметного времени, когда она потерпела неудачу, но когда она была преобразована в ValidationRule, это было эффективно мгновенно.)
- Утечка памяти. Это зависит от того, как выполняются ваши правила проверки или реализации IDataErrorInfo.
- Модификация кода, повторное использование. Это, конечно, интересная часть. То, что вы действительно должны спрашивать, "когда целесообразно использовать ValidationRule вместо IDataErrorInfo или наоборот?"
ValidationRules старше, чем IDataErrorInfo (я считаю, что последний был введен в .Net 3.5). Исходя из этого, казалось бы, команда WPF предпочитает IDataErrorInfo. Но правда в том, что они созданы для разных вещей. Если у вас MVVM или эквивалентный шаблон, IDataErrorInfo превосходит ошибки в модели (например, отрицательный возраст), тогда как ValidationRules превосходят ошибки в представлении (например, возраст ☃). Конечно, возможно, чтобы проверки ValidationRules выполняли проверки "бизнес-логики" или чтобы IDataErrorInfo сообщал вам, что "снеговик с юникодом не является допустимым возрастом", но вы, вероятно, получите лучшую ремонтопригодность, придерживаясь этого шаблона.
Но не используйте исключения для проверки за пределами начального тестирования, чтобы узнать, какие именно условия вы должны тестировать.