Я создал небольшой проект библиотеки dotnetstandard 2.1
в решении. Я хочу проверить, используя ссылочные типы, допускающие значение NULL. В рамках этого я хочу иметь соответствующие ошибки компиляции и предупреждения.
TLDR; Я хочу знать, как правильно настроить параметры качества кода CA1062 в .editorconfig
.
Библиотечный проект
Я добавил в проект следующие nuget
пакеты:
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="2.9.8">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Ardalis.GuardClauses" Version="1.4.2" />
</ItemGroup>
Сюда входят различные пакеты анализа кода, а также прекрасная библиотека Guard Clauses Стива Смита.
Обнуляемые ссылочные типы были включены с помощью <Nullable>enable</Nullable>
в проекте.
И у меня есть класс, который в реальном мире был бы хорошей реализацией, которая действительно что-то делала:
using System;
using MyGuards;
namespace EditorConfigIssues
{
public static class TestEditorConfig
{
public static void TestMethod(MyParam input)
{
string x = input.Check;
Console.WriteLine(x);
}
}
public class MyParam
{
public MyParam(string check) => Check = check;
public string Check { get; }
}
}
Проект библиотеки гвардии
В решении я добавил простую библиотеку Guard, которая является еще одним проектом dotnetstandard 2.1
.
using System;
namespace MyGuards
{
public static class FakeGuard
{
public static void Validate(object obj)
{
if (obj == null)
throw new ArgumentNullException();
}
}
}
ПРИМЕЧАНИЕ. Это не конкурирует с библиотекой GuardClauses — просто используйте для сравнения с editorconfig!
.editorconfig
Я добавил .editorconfig
в корень решения со следующими диагностическими проверками:
dotnet_diagnostic.CA1062.severity = error
dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true
Таким образом, при компиляции я получаю следующее:
Так что пока все так, как я ожидаю. Я пока не пользуюсь никакими предохранителями.
Исправляем это - Библиотека гвардии Стива Смита
Итак, давайте попробуем реализовать предложения защиты из библиотеки защиты Стива Смита, чтобы избавиться от ошибки.
Итак, мы добавляем следующее к TestEditorConfig.TestMethod
:
Guard.Against.Null(input, nameof(input));
и настройте .editorconfig
с помощью:
dotnet_code_quality.CA1062.null_check_validation_methods = Ardalis.GuardClauses.Guard.Against.Null
Отлично, все хорошо. Ошибка исчезла.
Исправляем - моя собственная библиотека охраны
Но теперь я хочу использовать собственную защиту. Поэтому мы заменяем начальную проверку защиты в TestEditorConfig.TestMethod
на:
FakeGuard.Validate(input);
и замените null_check_validation_methods в .editorconfig
на:
dotnet_code_quality.CA1062.null_check_validation_methods = FakeGuard.Validate
Вопросы)
- Вопрос, что мне нужно для того, чтобы использовать проект с гвардией из того же решения?
- Почему я получаю предупреждения для другого CA1062 в окне ошибок?
The keyword "dotnet_code_quality.CA1062.exclude_extension_method_this_parameter" is unknown
The keyword "dotnet_code_quality.CA1062.null_check_validation_methods" is unknown
Я проверял эту ссылку MS Docs Code Качество и испробовали различные комбинации для FakeGuard, в том числе:
- MyGuards
- MyGuards.FakeGuard
- FakeGuard
- MyGuards.FakeGuard.Validate
- FakeGuard.Проверить
- Подтвердить
Любопытно, что в другом решении я не получаю жалоб на настройки редактора CA1062 в окне ошибок. И там мне не удалось заставить работать null_check_validation_methods
, поэтому я собрал это решение. Это беспокоило меня в течение месяца или двух, но, наконец, я получил энергию, чтобы собрать вещи воедино.
Ошибка EditorConfig?
Если я скопирую файл FakeGuard в проект библиотеки, то сообщение об ошибке исчезнет. Но почему это не работает в другом проекте в решении.