CA1026 (все параметры должны иметь значения по умолчанию) и методы расширения
Предпосылка
При использовании анализа кода (или fxCop) с дополнительными параметрами С# вы можете получить предупреждение CA1026. Короткий аргумент 1 для этого не выдает все параметры со значением по умолчанию.
В приведенном ниже правиле объявление генерирует это предупреждение
public Color GetColor(bool red, bool blue = true, bool green = true)
Однако существует ситуация, когда вы не можете предоставить все параметры по умолчанию, и это методы расширения. Поэтому нижеприведенное объявление генерирует предупреждение из-за первого параметра:
public static bool ValidateRules(this string s, Rules rules = Rules.Default)
Компилятор не позволит вам указать значение по умолчанию для этого параметра, поэтому единственные два решения:
- Игнорируйте предупреждение, которое мне не нравится делать, потому что это приводит к плохой практике.
- Не использовать методы расширения, которые мне не нравятся, потому что я нахожу методы расширения, делая код более понятным.
Вопросы
- Являются ли указанные выше два варианта единственными
способ решить это?
- Является ли fxCop/Code
Неверный в нем анализ проверки?
Ответы
Ответ 1
Он не предупреждает вас о том, что у вас нет настроек по умолчанию для всех параметров - он предупреждает вас об использовании необязательных параметров вообще.
Лично я отключу это конкретное предупреждение. При использовании с осторожностью, я думаю, что дополнительные параметры прекрасны. Вы должны тщательно обдумать их, в частности, с точки зрения версии значения параметра по умолчанию и с точки зрения языков, которые их не поддерживают (включая С# перед v4), но во многих средах недостатки действительно не являются проблемой - и вы можете закончить с гораздо более простым кодом, чем путем указания перегрузок по всему месту.
Ответ 2
Вы можете подавить предупреждение в каждом конкретном случае.
Ответ 3
Аргумент, который я пропускаю в ответе Джона Скита, также связан с ремонтопригодностью: значения по умолчанию всегда заполняются этим значением в IL (промежуточный язык). Это проблема, если вы используете внешние библиотеки.
Вот шаги, чтобы воспроизвести простой пример:
- Создать консольное приложение
- Добавьте к
ClassLibrary
проект ClassLibrary
- Добавьте следующий код:
Program.cs
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var obj = new Class1();
Console.WriteLine(obj.Foo());
Console.ReadKey();
}
}
}
и в вашем Class1.cs
namespace ClassLibrary1
{
public class Class1
{
public string Foo(string str = "http")
{
return str;
}
}
}
Если вы запустите его, вы увидите "http", как и ожидалось.
- Теперь измените "http" на "https"
- Скомпилируйте только библиотеку (возможно, даже выгрузите консольный проект)
- Скопируйте dll из папки bin библиотеки в папку bin консольного приложения вручную
- Запускайте консольное приложение из командной строки, а не из VS!
Вы все равно увидите http
! С ILSpy вы можете видеть, что http
жестко запрограммирован в консольном приложении.
В этом случае это может привести к проблеме безопасности, если разработчик считает, что он безопасен, заменив "http" на "https" в значении по умолчанию.
Поэтому, если внешние библиотеки обновляются, всегда компилируйте ваш код снова. Или просто не используйте значения по умолчанию.
Просто создайте отдельный метод:
public string Foo()
{
return Foo("https");
}
public string Foo(string str)
{
return str;
}