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

С# Code Analysis CA1822 Предупреждение - Почему?

У меня есть метод, показанный ниже, который генерирует предупреждение анализа кода 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."

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

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

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

   ParseFile.IVAFile(lines);
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

В ситуации типа

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

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

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

Ответ 4

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

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

Ответ 5

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

this.m_anyVariable = anyValue;

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