Когда проверить на пустые указатели

Я люблю компиляторы и VMs, и я люблю Lua.

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

(И это - лицензия MIT с открытым исходным кодом)

5
задан PositiveGuy 28 September 2009 в 19:04
поделиться

6 ответов

Вы не должны бросать NullReferenceException . Если это аргумент, который имеет значение null, вместо этого выбрасывайте ArgumentNullException .

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

15
ответ дан 18 December 2019 в 05:55
поделиться

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

Иногда я использую для этого вспомогательный метод расширения, поэтому я могу написать:

public void Foo(string x, string y, string z)
{
    x.ThrowIfNull("x");
    y.ThrowIfNull("y");
    // Don't check z - it's allowed to be null
    // Method body here
}

ThrowIfNull вызовет исключение ArgumentNullException с подходящим именем.

Если явно проверить перед , вы сделаете какие-либо другие вызовы, вы знаете, что если возникнет исключение, больше ничего не будет произошло, так что у вас не будет испорченного государства.

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

С помощью контрактов кода я бы написал:

public void Foo(string x, string y, string z)
{
    Contract.Requires(x != null);
    Contract.Requires(y != null);

    // Rest of method here
}

Это вызовет ContractException вместо ArgumentNullException , но вся информация по-прежнему присутствует, и никто не должен явно перехватывать ArgumentNullException (кроме, возможно, борьбы с злонамеренностью третьих лиц).

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

Для Code Contracts я бы написал:

public void Foo(string x, string y, string z)
{
    Contract.Requires(x != null);
    Contract.Requires(y != null);

    // Rest of method here
}

Это вызовет исключение ContractException вместо ArgumentNullException , но вся информация по-прежнему присутствует, и никто не должен ее ловить. ArgumentNullException в любом случае явно (кроме, возможно, борьбы с вредоносными программами третьей стороны).

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

Для Code Contracts я бы написал:

public void Foo(string x, string y, string z)
{
    Contract.Requires(x != null);
    Contract.Requires(y != null);

    // Rest of method here
}

Это вызовет исключение ContractException вместо ArgumentNullException , но вся информация по-прежнему присутствует, и никто не должен ее ловить. ArgumentNullException в любом случае явно (кроме, возможно, борьбы с вредоносными программами третьей стороны).

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

но вся информация по-прежнему присутствует, и никто не должен в любом случае явно перехватывать ArgumentNullException (кроме, возможно, чтобы справиться с злонамеренностью третьих лиц).

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

но вся информация по-прежнему присутствует, и никто не должен в любом случае явно перехватывать ArgumentNullException (кроме, возможно, чтобы справиться с злонамеренностью третьих лиц).

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

6
ответ дан 18 December 2019 в 05:55
поделиться

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

class A
{
  private string _Name
  public string Name
  {
    get { return _Name; }
    set 
    {
      if (value == null)
         throw new ArgumentNullException("Name");
      _Name = value;
    }
  }

  public A(string name)
  {
     //Note the use of property with built in validation
     Name = name;
  }
}
1
ответ дан 18 December 2019 в 05:55
поделиться
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
Вы также можете изучить контракты кода в C # 4.0 как способ улучшить свой код. Контракты кода выполняют как статические проверки, так и проверки во время выполнения, что может помочь выявить проблемы даже во время компиляции.

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

В качестве примечания, ReSharper - хороший инструмент для определения потенциального доступа к аргументам или локальным членам, которые могут иметь значение NULL во время выполнения.

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

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

В качестве примечания, ReSharper - хороший инструмент для определения потенциального доступа к аргументам или локальным членам, которые могут иметь значение NULL во время выполнения.

Контракты кода выполняют как статические проверки, так и проверки во время выполнения, что может помочь выявить проблемы даже во время компиляции.

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

В качестве примечания, ReSharper - хороший инструмент для определения потенциального доступа к аргументам или локальным членам, которые могут иметь значение NULL во время выполнения.

6
ответ дан 18 December 2019 в 05:55
поделиться

Зависит от вашего типа метода / api / library / framework. Я думаю, что это нормально для частных методов, что они не проверяют нулевые значения, если только они не являются методами утверждения.

Если вы программируете защитную программу и засоряете свой код тестами «not null» или «if», ваш код будет нечитабельно.

Определите области, в которых клиент может испортить ваш код, отправив неправильные / пустые / нулевые аргументы. Если вы знаете, где, вы можете провести черту, где нужно выполнять нулевые проверки. Сделайте это в точках входа api, как в реальной жизни работает безопасность.

Представьте, что вам нужно каждую минуту показывать билет в кинотеатр, каждый фильм - отстой.

0
ответ дан 18 December 2019 в 05:55
поделиться

Я предпочитаю использовать методы статического шаблона для проверки ограничений ввода. общий формат для этого будет примерно таким:

static class Check {
    public static T NotNull(T arg) {
        if( arg == null ) throw new ArgumentNullException();
    }
}

Преимущество его использования в том, что теперь ваш метод или конструктор может заключить первое использование аргумента в Check.NotNull (), как показано здесь:

this.instanceMember = Check.NotNull(myArgument);

Когда я доберусь до .Net 4, я, скорее всего, конвертирую в контракты кода, но до тех пор это работает. Кстати, вы можете найти более полное определение класса проверки, который я использую, по следующему адресу:

http://csharptest.net/browse/src/Shared/Check.cs

0
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: