2010-02-09 2 views
27

У меня есть метод, показанный ниже, который генерирует предупреждение анализа кода CA1822. CA1822 говорит, что это:C# Code Analysis 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); 
} 

ответ

42

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

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

15

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

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

2

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

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

2

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

this.m_anyVariable = anyValue; 

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

+5

Почему * должен * метод быть помечен как статический? В чем польза? –

+5

Ahh, из-за производительности. Из MSDN: «После того, как вы помечаете методы как статические, компилятор будет выставлять неиртуальные сайты вызовов этим членам. Испускание не виртуальных сайтов вызовов предотвратит проверку во время выполнения для каждого вызова, который гарантирует, что текущий указатель объекта не равен нулю. может достичь измеримого прироста производительности для кода, чувствительного к производительности. В некоторых случаях отказ в доступе к экземпляру текущего объекта представляет собой проблему корректности ». –

3

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

В ситуации, как

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

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

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

+0

Вы пробовали форсировать 'this.GetType(). Name'? Это устраняет предупреждение? –

Смежные вопросы