Должен ли я подавлять CA1062: подтвердить аргументы публичных методов?

StackOverflow https://stackoverflow.com/questions/2856667

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

Это зависит. Конвенция при использовании ArgumentNullexception - включить имя аргумента NULL в описании. Таким образом, абонент узнает именно то, что пошло не так.

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

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

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

Другие советы

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

IMHO Нет. Проверка нулей почти никогда не будет иметь узкое место работы производительности в вашем приложении. (А в одном в миллионе случаев, когда оно значительно, вы найдете его с вашим профилировщиком и удалите этот случай).

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top