Как принудительно выполнить проверку нуля?
Я работаю над крупным проектом, где даже с 10-ю тысячами автоматизированных тестов и 100% -ным охватом кода мы получаем нелепое количество ошибок. Около 95% ошибок, которые мы получаем, это NullReferenceExceptions.
Есть ли способ принудительно выполнить проверку нулей во время компиляции?
Запрет на то, есть ли какой-либо способ автоматического обеспечения проверки нулевой отметки в модульных тестах без необходимости самостоятельно писать тесты для нулевых случаев?
Ответы
Ответ 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>
Компилятор сможет отличить
Ответ 8
ни один из них не возможен с С# 3. вам нужно будет использовать что-то вроде SpeС#... я думаю, что С# 4 может иметь некоторые из встроенных в него, но я не уверен в этом.
speС#: http://research.microsoft.com/en-us/projects/specsharp
Ответ 9
Вы не можете иметь нулевую проверку во время компиляции во время компиляции объектов только типы и только во время выполнения Типы преобразуются в случаях, которые имеют конкретное значение... здесь нуль.
Ответ 10
Возможно, вам стоит взглянуть на политику проверки пользовательского кода для TFS
http://weblogs.asp.net/uruit/archive/2009/03/17/writing-custom-rules-for-tfs-2008-code-analysis-check-in-policy.aspx
Ответ 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
. Вы можете также довольно тривиально написать свой собственный.