Подтвердить что ты не робот

Как принудительно выполнить проверку нуля?

Я работаю над крупным проектом, где даже с 10-ю тысячами автоматизированных тестов и 100% -ным охватом кода мы получаем нелепое количество ошибок. Около 95% ошибок, которые мы получаем, это NullReferenceExceptions.

Есть ли способ принудительно выполнить проверку нулей во время компиляции?

Запрет на то, есть ли какой-либо способ автоматического обеспечения проверки нулевой отметки в модульных тестах без необходимости самостоятельно писать тесты для нулевых случаев?

4b9b3361

Ответ 1

Вы должны изучить Кодовые контракты. Статический проверитель доступен только для версий высшего класса VS, но это в основном то, что вам нужно.

В Интернете много ресурсов, и <plug> вы также можете прочитать предварительную версию главы о кодовых контрактах из 2-го издания С# в Depth - бесплатно скачать главу 15. </plug> (Эта глава немного устарела в отношении последней и самой большой сборки кодовых контрактов, но ничего огромного.)

Ответ 2

100% покрытие кода ничего не значит.

Это ложное чувство безопасности.

Единственное, что вы измеряете, это то, что вы выполняете все строки кода.

Не:

  • Чтобы эти строки кода были строками кода, которые должны были быть там
  • Чтобы эти строки кода работали правильно (проверяете ли вы все случаи краев?)

Например, если ваша процедура для борьбы с огнем содержит 1 шаг "выбежать из здания", то даже если это произойдет в 100% случаев, возможно, лучшей процедурой будет "предупредить пожарный отдел, попытайтесь остановить огонь, затем выбегите, если все остальное не получится".

В С# ничего не встроено, что поможет вам с этим, если вы специально не входите и не добавляете код, ни кодовые контракты (.NET 4.0), ни конкретные IF-инструкции (< 4.0).

Ответ 3

Это не техническое решение, а социальное. Просто сделайте неприемлемым в своей среде доступ к ссылочному типу без проверки на нуль, когда ссылочный тип каким-либо образом был изменен внешним кодом (другой вызов метода и т.д.). Unit Testing не заменяет хороший старомодный обзор кода.

Ответ 4

Есть ли способ принудительно выполнить проверку нулей во время компиляции?

Неа. Компилятор не может определить, указана ли эталонная переменная времени выполнения на null.

И исключить также нулевые исполнительные операторы (наборы и возврат) тоже недостаточно. Рассмотрим:

public class Customer
{
  public List<Order> Orders {get;set;}
}
  //now to use it
Customer c = new Customer;
Order o = c.Orders.First(); //oops, null ref exception;

Ответ 5

1) Я думаю, Resharper может предложить вам проверить некоторые критические места в вашем коде. Например, он предлагает добавить [нулевой контрольный код] и добавляет его, если вы разрешаете.

Попробуйте. Это, конечно, увеличит ваш опыт, если вам нужно.

2) Используйте шаблон "Fail Fast" (или утвердите, утверждения) в своем коде на ранней стадии разработки.

Ответ 6

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

Ответ 7

В С# 8 введены ненулевые ссылочные типы.

Проект .Net можно изменить, чтобы включить параметр Nullable:

<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>

Компилятор сможет отличить

  • string и string?

  • NonNullableClass и NullableClass?

Ответ 8

ни один из них не возможен с С# 3. вам нужно будет использовать что-то вроде SpeС#... я думаю, что С# 4 может иметь некоторые из встроенных в него, но я не уверен в этом.

speС#: http://research.microsoft.com/en-us/projects/specsharp

Ответ 9

Вы не можете иметь нулевую проверку во время компиляции во время компиляции объектов только типы и только во время выполнения Типы преобразуются в случаях, которые имеют конкретное значение... здесь нуль.

Ответ 11

В .NET Framework было показано, что принудительные проверки ссылочных значений времени компиляции используются с помощью! Модификатор.

public void MyMethod(!string cannotBeNull)

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

public class ExternalFacing
{
  public void MyMethod(string arg)
  {
     if (String.IsNullOrEmpty(arg))
        throw new ArgumentNullException(arg);

     implementationDependency.DoSomething(arg);
   }
}

internal class InternalClass
{
    public void DoSomething(string arg)
    {
         // shouldn't have to enforce null here.
    }
}

Затем примените соответствующие модульные тесты к классу External, чтобы ожидать ArgumentNullExceptions.

Ответ 12

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

Ответ 13

Отъезд Gendarme, он может запускаться после сборки вместе с вашими испытаниями (возможно, перед ними, если хотите), и несколько правил, относящихся к проверкам null. Вы можете также довольно тривиально написать свой собственный.