Анализ кода C # CA1822 Предупреждение. Почему? - PullRequest
31 голосов
/ 09 февраля 2010

У меня есть метод, показанный ниже, который генерирует предупреждение анализа кода CA1822. CA1822 говорит это:

"The 'this parameter (or 'Me' in Visual Basic) of 'ImportForm.ProcessFile(StreamReader)' is never used. Mark the member as static (or Shared in Visual Basic) or use 'this/Me' in the method body or at least one property accessor, if appropriate."

Может кто-нибудь сказать мне, почему я получаю это предупреждение, поскольку параметр 'reader' фактически используется?

private void ProcessFile(StreamReader reader)
{
   string[] lines;

   lines = reader.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.None);

   ParseFile.IVAFile(lines);
}

Ответы [ 5 ]

46 голосов
/ 09 февраля 2010

Это означает, что вы не используете членов объекта. Все элементы метода получены из параметров.

Поэтому метод можно смело сделать статическим.

16 голосов
/ 09 февраля 2010

«читатель» используется, но вы нигде не используете «это», поэтому вы можете сделать метод статическим.

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

3 голосов
/ 06 июня 2014

Возможно, я обнаружил вредоносное поведение этого сообщения.

В ситуации, подобной

void Print()
{
    Console.Writeline(GetType().Name);
}

Мне сообщают об этом CA1822, хотя GetType() является методом экземпляра. Однако я нашел какое-то объяснение, почему GetType() на самом деле не виртуальный метод, не метод вместо, а технически ведет себя как статический метод.

Просто анализ кода не учитывает это специальное поведение.

2 голосов
/ 09 февраля 2010

Предупреждение возникает из-за того, что в этом методе не используются переменные-члены этого класса. Э.Г.

this.m_anyVariable = anyValue;

Поэтому вы можете / должны пометить этот метод как статический.

2 голосов
/ 09 февраля 2010

Я думаю, что он пытается сказать вам, что этот метод можно сделать статическим.

Единственное, к чему этот метод должен получить доступ - это «читатель», но ничего из экземпляра класса, к которому он принадлежит («это»). В этом случае вы можете безопасно сделать его статичным.

...