Дизайн по контракту / C # 4.0 / исключение ArgumentNullException
-
10-07-2019 - |
Вопрос
Мне ужасно надоело проверять все мои аргументы на ноль и выбрасывать ArgumenutNullExceptions, когда они есть.
Насколько я понимаю, C # 4.0 допускает некоторый дизайн по контрактным конструкциям. Можно ли будет указать, что метод не будет принимать нулевые аргументы в C # 4.0?
Кроме того, могу ли я что-нибудь сделать в это время (может быть, атрибут?), чтобы избежать этой монотонной задачи проверки на ноль и броски?
Решение
Вы можете создать NotNull<T>
универсальный класс, который помогает, но есть некоторые побочные эффекты. См. сообщение в блоге Роберта Нистрома . р>
Другие советы
Рик Брюстер описывает хорошее решение для краткой декларативной проверки параметров стиля в этом посте,
http: // blog.getpaint.net/2008/12/06/a-fluent-approach-to-c-parameter-validation/ р>
Предотвращает использование отражения (недостаток DbC) и не создает накладных расходов для неисключительного пути кода.
Например, как он использует методы расширения, чтобы разрешить вызовы методов экземпляра для нулевых объектов. Очень умный бит кодирования IMO.
Если вы проданы в DbC, Google Spec # и PostSharp.
Не уверен насчет собственных конструкций DbC в C # 4.0, но Microsoft собирается выпустить кросс-язык Библиотека контрактов .
Вы можете скачать версию для MSVS2008 здесь а>. р>
В качестве альтернативы уже приведенным ответам стоит заглянуть в Null Object design pattern
.
Суть этого шаблона проектирования в том, что когда-то " null object " создается, больше нет необходимости выполнять какие-либо проверки на нулевое значение, а методы нулевого объекта реализуют желаемое поведение всякий раз, когда передается нулевое значение (в противном случае) по сравнению со ссылкой на " реальный объект & Quot;. р>
Этот шаблон проектирования не зависит от C # 4.0 и фактически может быть легко реализован практически на любом языке программирования OO .
Я только начал использовать Code Contracts, новую функцию в C # 4.0, вам нужно скачать надстройку от MS, чтобы вы могли видеть ее в настройках вашего проекта. Подробности здесь - & Gt; http://research.microsoft.com/en-us/projects/contracts/ а> р>