Я собираюсь приступить к новому проекту C#. Мне было интересно, в чем разница между использованием кодовых контрактов или анализаторов кода (в Рослине). Не понимаю ли я каждого из них? Будучи новым проектом, я хотел бы сохранить целостность кода. Поэтому я хочу, чтобы другие разработчики придерживались определенных правил кода. Я буду исследовать их дальше, но я хотел сначала получить мнение сообщества. Извините вопрос, я все еще довольно новичок в разработке C#.Кодовые контракты и анализаторы кода
ответ
Это два разных инструмента.
Код Контракты это способ заявить и проверить ... ну, контракты, такие как предварительные условия и постусловий:
public class Foo
{
public Foo(object arg)
{
Contract.Requires<ArgumentNullException>(arg != null);
}
public object GetBar()
{
Contract.Ensures(Contract.Result<object>() != null);
// TODO:
}
}
CC проверить свои условия во время выполнения. Для этого необходимо, чтобы ваша сборка (а не исходный код!) была переписана после компиляции, чтобы ввести соответствующие вызовы в ваш код.
Анализаторы кода используют Roslyn для анализа Исходный код, пока вы его пишете. Они могут помочь вам форматировать код, чтобы напомнить вам позвонить Dispose
по телефону IDisposable
и т. Д., Но они не влияют непосредственно на поведение во время выполнения.
Существует ряд анализаторов, сгруппированных по назначению в проекты (например, StyleCopAnalyzers), а Code Contracts - автономный проект.
(CC также имеет статический анализатор, но я не могу сказать здесь много - он убивает производительность при использовании на реальных проектах, поэтому для меня обычно отключается. В любом случае, это необходимо для проверки контрактов.)
Анализаторы кода проанализируют ваш код на наличие распространенных ошибок. Они рассматривают структуру кода и поток данных для обнаружения проблем.
Другие типы анализаторов смотрят на стиль (например, StyleCop), капители, корпус верблюда, префиксы, постфикс и что у вас есть.
Третий тип - это кодовые контракты, о которых вы упомянули, и это работает несколько иначе. Вы объявляете ожидаемое поведение вашего кода, например, что ожидается от параметров, переданных в метод, исключения из которых могут вызывать код и т. Д. Анализатор контрактов затем проверяет, проходит ли код вызова в правильных параметрах (например, анализатор обнаружит вы передаете нуль и будете вызывать ошибку, если это не разрешено). В то же время он будет проверять «внутреннюю согласованность» ваших методов, чтобы убедиться, что вы не бросаете исключения, которые вам не разрешено бросать. В зависимости от исполнения контракты могут быть проверены во время выполнения или во время компиляции.
спасибо за это. Так что кодовые контракты будут влиять на производительность? –
Если вы хотите узнать больше о кодовых контрактах, отметьте эту книгу https://www.syncfusion.com/resources/techportal/details/ebooks/csharpcontracts –
@JonMeyers: CC увеличит время на создание проекта из-за перезаписи , Во время выполнения контракты работают медленнее, чем 'if ... throw', но я сомневаюсь, что вы увидите разницу в большинстве случаев. В то же время есть значительные преимущества от использования CC. – Dennis