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

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 Неверный в нем анализ проверки?

4b9b3361

Ответ 1

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

Лично я отключу это конкретное предупреждение. При использовании с осторожностью, я думаю, что дополнительные параметры прекрасны. Вы должны тщательно обдумать их, в частности, с точки зрения версии значения параметра по умолчанию и с точки зрения языков, которые их не поддерживают (включая С# перед v4), но во многих средах недостатки действительно не являются проблемой - и вы можете закончить с гораздо более простым кодом, чем путем указания перегрузок по всему месту.

Ответ 2

Вы можете подавить предупреждение в каждом конкретном случае.

Ответ 3

Аргумент, который я пропускаю в ответе Джона Скита, также связан с ремонтопригодностью: значения по умолчанию всегда заполняются этим значением в IL (промежуточный язык). Это проблема, если вы используете внешние библиотеки.

Вот шаги, чтобы воспроизвести простой пример:

  1. Создать консольное приложение
  2. Добавьте к ClassLibrary проект ClassLibrary
  3. Добавьте следующий код:

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", как и ожидалось.

  1. Теперь измените "http" на "https"
  2. Скомпилируйте только библиотеку (возможно, даже выгрузите консольный проект)
  3. Скопируйте dll из папки bin библиотеки в папку bin консольного приложения вручную
  4. Запускайте консольное приложение из командной строки, а не из VS!

Вы все равно увидите http ! С ILSpy вы можете видеть, что http жестко запрограммирован в консольном приложении.

В этом случае это может привести к проблеме безопасности, если разработчик считает, что он безопасен, заменив "http" на "https" в значении по умолчанию.

Поэтому, если внешние библиотеки обновляются, всегда компилируйте ваш код снова. Или просто не используйте значения по умолчанию.

Просто создайте отдельный метод:

        public string Foo()
        {
            return Foo("https");
        }

        public string Foo(string str)
        {
            return str;
        }