Есть ли простой атрибут или контракт данных, который я могу назначить параметру функции, который предотвращает передачу null
в C # /. NET? В идеале это также должно было бы проверяться во время компиляции, чтобы убедиться, что литерал null
нигде не используется для него и во время выполнения ArgumentNullException
.
Сейчас я пишу что-то вроде ...
if (null == arg)
throw new ArgumentNullException("arg");
... за каждый аргумент, которого я не ожидаю null
.
В том же примечании, есть ли противоположность тому, Nullable<>
что следующее не сработает:
NonNullable<string> s = null; // throw some kind of exception
c#
.net
parameters
null
Нил С. Обремски
источник
источник
Ответы:
К сожалению, во время компиляции нет ничего доступного.
У меня есть хакерское решение, которое я недавно опубликовал в своем блоге, в котором используется новая структура и преобразования.
В .NET 4.0 с материалом Code Contracts жизнь станет намного лучше. Было бы неплохо иметь реальный синтаксис языка и поддержку недопустимости обнуления, но контракты кода очень помогут.
У меня также есть метод расширения в MiscUtil под названием ThrowIfNull, который делает его немного проще.
И последнее: есть ли причина для использования "
if (null == arg)
" вместо "if (arg == null)
"? Я считаю, что последнее легче читать, а проблема, которую первый решает на C, не относится к C #.источник
if (null == x)
в различиях естественного языка. Я считаю, что это действительно устаревший стиль, который просто распространяется через примеры и т. Д.Я знаю, что невероятно опаздываю с этим вопросом, но я чувствую, что ответ станет актуальным, когда последняя крупная итерация C # приблизится к выпуску, а затем будет выпущена. В C # 8.0 произойдет серьезное изменение, C # будет предполагать, что все типы не считаются нулевыми.
По словам Мадса Торгерсена:
Итак, резолюция, изложенная Мэдсом, такова:
Пример желаемой функции:
Предварительная версия доступна для Visual Studio 2017, предварительная версия версии 15.5.4+.
источник
Я знаю, что это ОЧЕНЬ старый вопрос, но здесь не было этого:
Если вы используете ReSharper / Rider, вы можете использовать аннотированный фреймворк .
Изменить : я получил случайный -1 для этого ответа. Это хорошо. Просто имейте в виду, что он по- прежнему действителен, хотя он больше не рекомендуется для проектов C # 8.0 + (чтобы понять, почему, см . Ответ Грега ).
источник
Ознакомьтесь с валидаторами в корпоративной библиотеке. Вы можете сделать что-то вроде:
Затем в вашем коде, когда вы хотите его проверить:
источник
не самый красивый, но:
вы также можете проявить больше творчества в методе ContainsNullParameters:
конечно, вы можете использовать перехватчик или отражение, но за ними легко следить / использовать с небольшими накладными расходами
источник
return (from o in methodParams where o == null).Count() > 0;
Использование:return methodParams.Any(o=>o==null);
это будет намного быстрее при больших коллекцияхХорошо, этот ответ немного запоздал, но вот как я его решаю:
Используйте этот метод расширения, тогда вы можете обрабатывать нулевую и пустую строку как одно и то же.
Например
Не идеально, я знаю, так как вы должны помнить, что везде нужно вызывать default, но это одно из решений.
источник
string.IsNotNullOrEmpty
самом деле, кроме того сахара, что то, что вам небезразлично слева. Может быть загружен в другие функции (длина, конкатенация) и т. Д. Немного лучше.Default()
) для null (model.Day
). Я знаю, что методы расширения не проверяются на нулевое значение, но мои глаза не знают, и они уже представили это?
в кодеmodel?.Day?.Default()
:)