Я люблю компиляторы и VMs, и я люблю Lua.
Lua также не поддерживается как много других языков сценариев, но от мышления как Ваше я уверен, что Вы влюбитесь в Lua также. Я подразумеваю, что это похоже на шепелявость, (может сделать что-либо, что шепелявость может, насколько я знаю), имеет много основных функций от ADA, плюс он имеет метапрограммирование, созданное прямо в с функциональным программированием и объектно-ориентированным программированием, достаточно свободным для создания любого типа доменного языка, который Вы могли бы хотеть. Помимо кода VM простой C, что означает, что можно легко вырыть прямо в него для понимания даже на том уровне.
(И это - лицензия MIT с открытым исходным кодом)
Вы не должны бросать NullReferenceException
. Если это аргумент, который имеет значение null, вместо этого выбрасывайте ArgumentNullException
.
Я предпочитаю проверять значение null для всех параметров ссылочных типов общедоступных / защищенных методов. Для частных методов вы можете опустить проверку, если уверены, что все вызовы всегда будут иметь действительные данные.
Если вы не используете кодовые контракты, я бы сказал, что хорошей практикой является проверка аргументов для любого общедоступного / защищенного члена, а также явное документирование того, могут они или не могут быть нулевыми. Для частных / внутренних методов это становится вопросом проверки вашего собственного кода, а не чьего-либо другого ... в этот момент это вопрос суждения.
Иногда я использую для этого вспомогательный метод расширения, поэтому я могу написать:
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
(кроме, возможно, чтобы справиться с злонамеренностью третьих лиц).
Конечно, решение о том, следует ли разрешить нулевые значения - совсем другое дело. Это полностью зависит от ситуации. Предотвращение попадания нулей в ваш мир действительно упрощает некоторые вещи, но в то же время нули могут быть полезны сами по себе.
Чем раньше, тем лучше. Чем раньше вы поймаете (недействительный) нуль, тем меньше вероятность, что вы выбросите его в середине какого-то критического процесса. Еще одна вещь, которую следует учитывать, - это использовать ваши свойства (сеттеры) для централизации вашей проверки. Часто я ссылаюсь на свои свойства в конструкторе, поэтому получаю хорошее повторное использование на этой проверке.
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;
}
}
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
Вы также можете изучить контракты кода в C # 4.0 как способ улучшить свой код. Контракты кода выполняют как статические проверки, так и проверки во время выполнения, что может помочь выявить проблемы даже во время компиляции.
В общем, написание предварительных условий для методов - это трудоемкая (и поэтому часто не выполняемая) практика. Однако преимущество этого типа защитного кодирования заключается в часах потенциально сэкономленного времени на отладку отвлекающих факторов , которые возникают из-за того, что вы не проверили свои входные данные.
В качестве примечания, ReSharper - хороший инструмент для определения потенциального доступа к аргументам или локальным членам, которые могут иметь значение NULL во время выполнения.
Контракты кода выполняют как статические проверки, так и проверки во время выполнения, которые могут помочь выявить проблемы даже во время компиляции.В общем, написание предварительных условий для методов - это трудоемкая (и поэтому часто не выполняемая) практика. Однако преимущество этого типа защитного кодирования заключается в часах потенциально сэкономленного времени на отладку отвлекающих факторов , которые возникают из-за того, что вы не проверили свои входные данные.
В качестве примечания, ReSharper - хороший инструмент для определения потенциального доступа к аргументам или локальным членам, которые могут иметь значение NULL во время выполнения.
Контракты кода выполняют как статические проверки, так и проверки во время выполнения, что может помочь выявить проблемы даже во время компиляции.В общем, написание предварительных условий для методов - это трудоемкая (и поэтому часто не выполняемая) практика. Однако преимущество этого типа защитного кодирования заключается в часах потенциально сэкономленного времени на отладку отвлекающих факторов , которые возникают из-за того, что вы не проверили свои входные данные.
В качестве примечания, ReSharper - хороший инструмент для определения потенциального доступа к аргументам или локальным членам, которые могут иметь значение NULL во время выполнения.
Зависит от вашего типа метода / api / library / framework. Я думаю, что это нормально для частных методов, что они не проверяют нулевые значения, если только они не являются методами утверждения.
Если вы программируете защитную программу и засоряете свой код тестами «not null» или «if», ваш код будет нечитабельно.
Определите области, в которых клиент может испортить ваш код, отправив неправильные / пустые / нулевые аргументы. Если вы знаете, где, вы можете провести черту, где нужно выполнять нулевые проверки. Сделайте это в точках входа api, как в реальной жизни работает безопасность.
Представьте, что вам нужно каждую минуту показывать билет в кинотеатр, каждый фильм - отстой.
Я предпочитаю использовать методы статического шаблона для проверки ограничений ввода. общий формат для этого будет примерно таким:
static class Check {
public static T NotNull(T arg) {
if( arg == null ) throw new ArgumentNullException();
}
}
Преимущество его использования в том, что теперь ваш метод или конструктор может заключить первое использование аргумента в Check.NotNull (), как показано здесь:
this.instanceMember = Check.NotNull(myArgument);
Когда я доберусь до .Net 4, я, скорее всего, конвертирую в контракты кода, но до тех пор это работает. Кстати, вы можете найти более полное определение класса проверки, который я использую, по следующему адресу: