Как я могу справиться с натиском пустых проверок?

Точный максимальный предел массива равен 2 ^ 32 - 1 или 4294967295 из-за ограничений в памяти Javascript.

blockquote>

Ссылка

22
задан Dmitri Nesteruk 9 January 2009 в 20:10
поделиться

18 ответов

Проверьте эту статью: А быстрый подход к проверке параметра C#

Это записано одним из Разработчиков Paint.NET. Он использует дополнительные методы, чтобы упростить и очистить пустой код проверки.

25
ответ дан Shawn 29 November 2019 в 03:26
поделиться

Вы могли всегда писать:

if (doc == null && doc.Element == null
{

}

, Но Вы теряете гранулярность с решением одно сообщение выше моего (например, отдельные сообщения в Исключении).

-3
ответ дан xpda 29 November 2019 в 03:26
поделиться

Если Вы собираетесь проверить, что параметр передал части Вашего общедоступного API, то необходимо использовать "защитные пункты" в самом начале метода как Dan Monego, имеет, записал. Код будет легким чтением, если Вы создадите, или повторное использование, которое любит некоторый класс помощника, Утверждает с методами как IsNotNull и другие (возможно, Вам действительно нужен только один из них).

Ваш код будет похож:

Assert.IsNotNull(doc, "document");
Assert.IsNotNull(doc.Element", "Element");

//... and so on

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

0
ответ дан okutane 29 November 2019 в 03:26
поделиться

Если Вы просто, оказывается, используете C#, рассматривают nullable.

0
ответ дан SquidScareMe 29 November 2019 в 03:26
поделиться

Не ловите исключения, если Вы не в состоянии сделать что-то интеллектуальное с ними.

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

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

РЕДАКТИРОВАНИЕ: быть проваленным, я чувствую себя недооцененным, возможно, я слишком чувствителен;-). Исключения, которые выдает исходный плакат, не имеют никакого значения. Они не помогают конечному пользователю, и они не помогают разработчику.

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

, ЕСЛИ БЫ исключение добавляет некоторое значение, то я согласился бы, что разумно бросить его. Но это не имеет место здесь. Еще хуже, как только Вы заявляете, что это - хороший принцип, Вы будете видеть намного больше строк проверки кода нулевые ссылки, до такой степени, что код будет нарушен ими.

1
ответ дан jdigital 29 November 2019 в 03:26
поделиться

Для обращения к людям, которые рекомендуют позволять времени выполнения бросать NullReferenceException:

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

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

1
ответ дан Community 29 November 2019 в 03:26
поделиться

Контракты являются основным элементом в сокращении связанных с пустым указателем проблем и лишних проверок.

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

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

существуют инструменты и функции языка, чтобы помочь Вам зарегистрировать и проверить правильность проверки пустого указателя и контрактов. Извините я не могу больше объяснять, потому что я не программист C#.

, Если Вы хотите погрузиться в глубже, я рекомендую те четыре вопроса. Они главным образом центральны Java, но почти все верно для C# также, и иногда ответы даже настраиваются к .net и c#.

2
ответ дан Community 29 November 2019 в 03:26
поделиться

Взгляните на" , Возможно, Монада ".

Это обращается к Вашему требованию читаемого способа сделать подробные Пустые регистрации C#.

существует также , Возможно, codeplex проект

2
ответ дан MiFreidgeim SO-stop being evil 29 November 2019 в 03:26
поделиться

Существует несколько опций (некоторые были уже упомянуты другими), таким образом, я просто добавляю к списку.

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

  2. , Если Вы хотите использовать статический метод, как предложил Paige, можно даже превратить его в дополнительный метод. Вы могли сделать что-то подобное:

     private static void ThrowIfNull(this object o, string message) {
        if (o != null) return;
        throw new ArgumentNullException(message);
     }
    
2
ответ дан Brian Rasmussen 29 November 2019 в 03:26
поделиться

Можно интересоваться Шаблон Несуществующего объекта .

Это помогло мне в прошлом избавиться от пустых регистраций большого количества экземпляров.

Пример (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"); 
         }
   }
3
ответ дан Doug T. 29 November 2019 в 03:26
поделиться

Если бы Вы чувствуете, что это нечитабельно из-за вложенной 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()
3
ответ дан Dave Costa 29 November 2019 в 03:26
поделиться

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

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

В целом, я пытаюсь осуществить пустую правильность на интерфейсных границах в моих классах. Я могу тогда проигнорировать пустые проверки в своих закрытых методах.

3
ответ дан Greg D 29 November 2019 в 03:26
поделиться

Возможно, конструктор класса должен только создать объект, если свойства инициализируются к соответствующим значениям? Это сказанное экземпляр был бы только создан, если он имеет минимальное количество свойств после создания, кроме которого Вы могли создать Проверение (Документ документа) метод, который по существу сделает то же самое, т.е. проверит законность объекта.

3
ответ дан kd7 29 November 2019 в 03:26
поделиться

Seperate (статичный?) вызов функции:

public static void CheckForNullObject( object Obj, string Message) {
    if(Obj == null){
        throw new Exception(Message);
    }
}

, В то время как это не было бы наилучшим вариантом, это будет немного более читаемо.

3
ответ дан Paige Watson 29 November 2019 в 03:26
поделиться

Вы могли бы интересоваться [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.

8
ответ дан Craz 29 November 2019 в 03:26
поделиться

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

doc.Element.whatever("foo");

Вы все еще получите NullPointerException (или независимо от того, что это находится в C#) с полной traceback информацией.

13
ответ дан Greg Hewgill 29 November 2019 в 03:26
поделиться

Подтолкните их к началу функции и не допустите их в часть кода, который делает работу. Как это:

if (doc == null)
    throw new ArgumentNullException("doc");
if (doc.Element == null)
    throw new ArgumentException("Element cannot be null");
AndSoOn(); 
17
ответ дан Sam Harwell 29 November 2019 в 03:26
поделиться

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

2
ответ дан Zombies 29 November 2019 в 03:26
поделиться