Точный максимальный предел массива равен 2 ^ 32 - 1 или 4294967295 из-за ограничений в памяти Javascript.
blockquote>
Проверьте эту статью: А быстрый подход к проверке параметра C#
Это записано одним из Разработчиков Paint.NET. Он использует дополнительные методы, чтобы упростить и очистить пустой код проверки.
Вы могли всегда писать:
if (doc == null && doc.Element == null
{
}
, Но Вы теряете гранулярность с решением одно сообщение выше моего (например, отдельные сообщения в Исключении).
Если Вы собираетесь проверить, что параметр передал части Вашего общедоступного API, то необходимо использовать "защитные пункты" в самом начале метода как Dan Monego, имеет, записал. Код будет легким чтением, если Вы создадите, или повторное использование, которое любит некоторый класс помощника, Утверждает с методами как IsNotNull и другие (возможно, Вам действительно нужен только один из них).
Ваш код будет похож:
Assert.IsNotNull(doc, "document");
Assert.IsNotNull(doc.Element", "Element");
//... and so on
, Если Вы собираетесь проверить, параметр передал одному из Ваших закрытых методов, тогда у Вас не должно быть таких проверок, вместо которых необходимо добавить контракт (в документации метода или с некоторыми специальными объявлениями, если Вы используете некоторый инструмент для того), и всегда ожидайте, что этот метод назовут с корректными параметрами.
Если Вы просто, оказывается, используете C#, рассматривают nullable.
Не ловите исключения, если Вы не в состоянии сделать что-то интеллектуальное с ними.
В этом случае, Ваши обработчики исключений добавляют, что мало значения по значению по умолчанию - то есть, позволяя исключениям распространить создает резервную копию цепочки вызовов.
На верхнем уровне Вашего приложения/потока, должны всегда быть обработчики исключений для контакта с этими неперехваченными исключениями.
РЕДАКТИРОВАНИЕ: быть проваленным, я чувствую себя недооцененным, возможно, я слишком чувствителен;-). Исключения, которые выдает исходный плакат, не имеют никакого значения. Они не помогают конечному пользователю, и они не помогают разработчику.
высокоуровневые обработчики исключений в приложении должны поймать исключение как это и зарегистрировать его. Журнал должен включать отслеживание стека. Это говорит разработчику, куда ошибка прибыла из и устраняет много строк кода, которые действительно не служат никакой цели.
, ЕСЛИ БЫ исключение добавляет некоторое значение, то я согласился бы, что разумно бросить его. Но это не имеет место здесь. Еще хуже, как только Вы заявляете, что это - хороший принцип, Вы будете видеть намного больше строк проверки кода нулевые ссылки, до такой степени, что код будет нарушен ими.
Для обращения к людям, которые рекомендуют позволять времени выполнения бросать NullReferenceException:
я запустил тему на предмет того, является ли это хорошей идеей заранее бросить ArgumentNullException или позволить времени выполнения бросить NullReferenceException. Основное согласие состояло в том, что это - хорошая идея проявить превентивный подход, а не подход NullReferenceException. Я не обязательно говорю, что они правы и люди, которые защищают иначе, здесь являются неправильными. Я просто говорю, что сообщество может не согласиться с Вами.
, Что я был бы , любят указывать, то, что, если Вы делаете партия из этих видов проверок, возможности хороши, что Вы делаете что-то не так. Или Ваши методы делают слишком много, или Вы раздаете слишком много аргументов "бродяги" (аргументы, которые не служат никакой цели кроме быть переданными другой функции). Возможно, необходимо рассмотреть, можно ли повредить код больше в отдельные методы или возможно инкапсулировать некоторые аргументы в объект.
Контракты являются основным элементом в сокращении связанных с пустым указателем проблем и лишних проверок.
существуют методы, которые могут возвратить пустой указатель в некоторых случаях. Если Вы называете метод как это, то просто необходимо проверить . Лучше проверять как можно раньше.
И существуют методы, которым не позволяют возвратить пустой указатель. Не проверяйте их возвращаемые значения. Каждый метод ответственен, чтобы гарантировать, что он выполняет свой собственный контракт, поэтому как вызывающая сторона того метода, о котором Вы не должны заботиться .
существуют инструменты и функции языка, чтобы помочь Вам зарегистрировать и проверить правильность проверки пустого указателя и контрактов. Извините я не могу больше объяснять, потому что я не программист C#.
, Если Вы хотите погрузиться в глубже, я рекомендую те четыре вопроса. Они главным образом центральны Java, но почти все верно для C# также, и иногда ответы даже настраиваются к .net и c#.
Взгляните на" , Возможно, Монада ".
Это обращается к Вашему требованию читаемого способа сделать подробные Пустые регистрации C#.
существует также , Возможно, codeplex проект
Существует несколько опций (некоторые были уже упомянуты другими), таким образом, я просто добавляю к списку.
Для некоторых типов имеет смысл использовать несуществующий объект. В этом случае необходимо удостовериться, что методы никогда не возвращают простой пустой указатель, но всегда возвращают экземпляр (который может быть несуществующим объектом).
, Если Вы хотите использовать статический метод, как предложил Paige, можно даже превратить его в дополнительный метод. Вы могли сделать что-то подобное:
private static void ThrowIfNull(this object o, string message) {
if (o != null) return;
throw new ArgumentNullException(message);
}
Можно интересоваться Шаблон Несуществующего объекта .
Это помогло мне в прошлом избавиться от пустых регистраций большого количества экземпляров.
Пример (C++)
class IThing
{
public:
virtual void DoThing() = 0;
};
class NullThing : public IThing
{
public:
virtual void DoThing() { /*no-op*/}
};
class RealThing : public IThing
{
public:
virtual void DoThing() { /*does something real*/}
};
int main()
{
NullThing theNullInstance; /* often a singleton or static*/
IThing* thingy = &theNullInstance; /*the null value*/
// Do stuff that may or may not set thingy to a RealThing
thingy->DoThing(); // If is NullThing, does nothing, otherwise does something
// Can still check for null
// If NullThing is a singleton
if (thingy == &theNullInstance)
{
printf("Uhoh, Null thingy!\n");
}
}
Если бы Вы чувствуете, что это нечитабельно из-за вложенной IFS, мое предложение должно было бы переписать как это:
if (doc == null)
{
throw new Exception("document cannot be null");
}
if (doc.Element == null)
{
throw new Exception("Element cannot be null");
}
doc.Element.someMethod()
Если типичное NullReferenceException
сделает, не потрудитесь проверять и просто позвольте броску во время выполнения это. Если Вам нужно в, добавляет контекстная информация об ошибке, для входа или отладки целей (или безотносительно), разрешение и факторизует Вашу проверку в различный метод. Я все еще поощрил бы Вас бросать NullReferenceException
за исходным вложенным исключением в этом случае.
я должен был сделать подобные вещи, когда я был вынужден к вручную munge через глубокие XML-документы.
В целом, я пытаюсь осуществить пустую правильность на интерфейсных границах в моих классах. Я могу тогда проигнорировать пустые проверки в своих закрытых методах.
Возможно, конструктор класса должен только создать объект, если свойства инициализируются к соответствующим значениям? Это сказанное экземпляр был бы только создан, если он имеет минимальное количество свойств после создания, кроме которого Вы могли создать Проверение (Документ документа) метод, который по существу сделает то же самое, т.е. проверит законность объекта.
Seperate (статичный?) вызов функции:
public static void CheckForNullObject( object Obj, string Message) {
if(Obj == null){
throw new Exception(Message);
}
}
, В то время как это не было бы наилучшим вариантом, это будет немного более читаемо.
Вы могли бы интересоваться [1 110] Spec#:
Spec# является формальным языком для контрактов API, который расширяет C# с помощью конструкций для [1 111] непустые типы , предварительные условия, постусловия, объектные инварианты и образцовые программы (поведенческие контракты, которые принимают историю во внимание всего выполнения).
можно сделать обязанностью вызывающей стороны удостовериться, что аргумент не является пустым. Spec# использует восклицательный знак для обозначения этого:
public static void Clear(int[]! xs) // xs is now a non-null type
{
for (int i = 0; i < xs.Length; i++)
{
xs[i] = 0;
}
}
Теперь компилятор Spec#, это обнаружит возможный пустой указатель, разыменовывает:
int[] xs = null;
Clear(xs); // Error: null is not a valid argument
Как примечание стороны, Вы могли бы также хотеть удостовериться, что Вы не повреждаетесь Закон Demeter.
Если Вы просто собираетесь выдать исключение так или иначе, почему бы не позволить времени выполнения языка бросить его для Вас?
doc.Element.whatever("foo");
Вы все еще получите NullPointerException (или независимо от того, что это находится в C#) с полной traceback информацией.
Подтолкните их к началу функции и не допустите их в часть кода, который делает работу. Как это:
if (doc == null)
throw new ArgumentNullException("doc");
if (doc.Element == null)
throw new ArgumentException("Element cannot be null");
AndSoOn();
Тот пример кода едва нечитабелен... Необходимо будет проверить на пустые указатели, когда существует возможность переменной, являющейся пустым. Однако, если Вы хотите сократить это, удостоверьтесь, что методы, которые возвращают объект, никогда не возвращают пустой указатель и всегда возвращают полностью допустимый и созданный объект. Имейте его, выдают исключение в случае, где у Вас был он пустой указатель возврата. Возвратом пустого указателя или-1 или некоторое другое нечетное соглашение нельзя заменить обработку ошибок.