Использование кодовых контрактов для указания возвращаемого значения может быть нулевым - PullRequest
9 голосов
/ 16 февраля 2012

Есть ли способ явного указания, что возвращаемое значение может быть нулевым с использованием кодовых контрактов?

Меня беспокоит то, что методы без Contract.Ensures(Contract.Result<object>() != null) могут быть неправильно «исправлены» в будущем, чтобы включить постусловие, даже если первоначальное намерение состояло в том, чтобы разрешить нулевые результаты.

Ответы [ 2 ]

9 голосов
/ 17 февраля 2012

Если есть какие-либо другие постусловия, это будет означать, что null является допустимым возвращаемым значением. Например, если метод должен вернуть положительное значение, но использует null, если происходит ошибка:

Contract.Ensures(Contract.Result<int?>() == null || 0 <= Contract.Result<int?>());

Однако, если вас беспокоит регрессия, лучшим решением может быть добавление модульного теста для ожидаемого null возвращаемого значения.

3 голосов
/ 07 ноября 2012

Если вы используете resharper, вы можете получить его для создания предупреждений, помечая методы с помощью атрибута CanBeNull, как описано здесь: http://blogs.jetbrains.com/dotnet/2010/11/resharper-nullreferenceexception-analysis-and-its-contracts/

Это сделано с использованием некоторых классов резарпера, но для удобства вам не нужно ссылаться на библиотеку - в опциях есть кнопка, чтобы вы могли получить аннотации. Небольшая вещь, о которой следует быть осторожным: вам нужно сохранить пространство имен, в котором они находятся, - похоже, что фактическая разметка выполняется полностью определенным именем (поэтому размещение классов в ваших собственных ns и их использование не приведут к нужным предупреждениям).

Это очень полезно для свойств, которые могут быть нулевыми в классах (например, когда пользовательское решение еще не принято / может быть удалено), но когда присвоение является объектом данных, что означает, что использование шаблона нулевого объекта нецелесообразно , У нас есть один из тех в проекте, над которым я работаю, который всегда запускает новых кодеров, которые не понимают, что он может быть нулевым.

...