Должен ли я подавить CA1062: проверить аргументы открытых методов? - PullRequest
5 голосов
/ 18 мая 2010

Я недавно обновил свой проект до Visual Studio 2010 с Visual Studio 2008.

В Visual Studio 2008 это правило анализа кода не существует.

Теперь я не уверен, следует ли мне использовать это правило или нет.

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

РЕДАКТИРОВАТЬ: Кроме того, существует проблема производительности, которую необходимо устранить. Проверка на null в каждом публичном методе может вызвать проблемы с производительностью.

Должен ли я удалить это правило или исправить нарушения?

Ответы [ 3 ]

6 голосов
/ 18 мая 2010

Это зависит.При использовании ArgumentNullException принято включать имя пустого аргумента в описание.Так что звонящий будет точно знать, что пошло не так.

Источник NullReferenceException (что произойдет, если вы не подтвердите) может быть легко определить, но если метод сложный, он может быть более сложным.Вы можете оказаться в строке кода, где несколько ссылок могут быть нулевыми.

Лично я предпочитаю, чтобы публичные методы генерировали ArgumentNullException, если они не могут обработать нулевой ввод для данного аргумента, поскольку он допускает согласованное поведение независимо от того, как реализован метод.

В ответ на редактирование: По моему мнению, более важно обеспечить согласованный набор интерфейсов с несколькими сюрпризами, чем оптимизацию каждой строки кода.Я предполагаю, что в большинстве случаев накладные расходы производительности при нулевой проверке не будут значительными.Если это окажется проблемой (как говорит профилирование), я бы подумал об ее изменении.Иначе я бы не считал это проблемой на данный момент.

3 голосов
/ 18 мая 2010

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

2 голосов
/ 18 мая 2010

ИМХО. Проверка на нулевые значения почти никогда не станет узким местом для производительности вашего приложения. (И в одном случае из миллиона, где это важно, вы найдете его в своем профилировщике и удалите этот один случай).

Другой вопрос, который должен возникнуть у вас в голове: «Неужели бросить новое NullReferenceException () действительно лучший способ справиться с ошибкой?» Зачастую вы можете справиться с этим лучше (даже если только предоставить лучший отчет об ошибках пользователю и / или себе для целей отладки). Во многих случаях код может корректно обрабатывать значения NULL, что делает ненужным, чтобы это вообще было ошибкой.

редактировать

Чтобы ответить на ваши изменения: нулевые проверки действительно не занимают много времени. Затраты на простой вызов метода будут в десятки, если не в сотни раз больше, чем нулевая проверка. Единственное место, где нулевая проверка будет иметь какое-либо существенное значение, - это большой плотный цикл, где вы делаете совсем немного. Такая ситуация случается не очень часто - обычно вы проверяете нулевое значение, а затем делаете что-то относительно дорогое с этой ссылкой.

Нет ситуации, когда сбой или сбой - это хорошая вещь. Всегда лучше «замедлить работу приложения» с нулевыми проверками, чем аварийно завершить работу и потерять данные вашего клиента.

Так что не преждевременно оптимизируйте свой код. Хорошо напишите это, чтобы его можно было поддерживать и поддерживать, а затем профиль , чтобы увидеть узкие места. Я программировал в течение 28 лет, был очень либеральным с нулевыми проверками, и никогда не обнаружил, что нулевая проверка была причиной проблемы с производительностью. Обычно это такие вещи, как выполнение большого количества ненужной работы в цикле, использование алгоритма O (n ^ 3), где возможен подход O (n ^ 2), неспособность кешировать дорогостоящие для вычисления значения и т. Д.

...