2010-02-09 4 views
27

Ich habe die unten gezeigte Methode, die eine CA1822 Code Analysis Warnung generiert. CA1822 sagt dies:C# -Code-Analyse CA1822 Warnung - Warum?

"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."

Kann mir jemand sagen, warum ich diese Warnung bin immer, da die ‚Leser‘ Parameter sind in der Tat verwendet?

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

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

    ParseFile.IVAFile(lines); 
} 

Antwort

42

Es bedeutet, dass Sie keine Mitglieder des Objekts verwenden. Alle Elemente in der Methode stammen aus den Parametern.

Daher kann die Methode sicher statisch gemacht werden.

15

"Leser" wird verwendet, aber Sie verwenden "dieses" nirgendwo, so dass Sie die Methode statisch machen können.

Der einzige Grund nicht, es statisch zu machen wäre, wenn Sie Polymorphie später verwenden möchten - z. virtuell machen und anderswo überschreiben.

2

Ich denke, es versucht Ihnen zu sagen, dass diese Methode statisch gemacht werden kann.

Die einzige Methode, auf die diese Methode zugreifen muss, ist "reader", aber nichts von der Klasseninstanz, zu der sie gehört ("this"). In diesem Fall können Sie es sicher statisch machen.

2

Die Warnung tritt auf, weil Sie in dieser Methode keine Mitgliedsvariablen dieser Klasse verwenden. Z.B.

this.m_anyVariable = anyValue; 

Daher können/sollten Sie diese Methode als statisch markieren.

+5

Warum sollte * die Methode als statisch markiert werden? Was ist der Vorteil? –

+5

Ahh, wegen der Leistung. Von MSDN: "Nachdem Sie die Methoden als statisch markiert haben, sendet der Compiler nicht virtuelle Aufrufwebsites an diese Member. Das Ausgeben nicht virtueller Aufrufwebsites verhindert eine Überprüfung zur Laufzeit für jeden Aufruf, der sicherstellt, dass der aktuelle Objektzeiger nicht null ist kann einen messbaren Leistungszuwachs für leistungsabhängigen Code erzielen. In einigen Fällen stellt der Fehler beim Zugriff auf die aktuelle Objektinstanz ein Korrektheitsproblem dar. " –

3

Vielleicht habe ich bösartiges Verhalten dieser Nachricht gefunden. In einer Situation

wie

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

Ich erhalte diese CA1822 berichtet, obwohl GetType() eine Instanzmethode ist. Ich fand jedoch einige Erklärung, warum GetType() ist eigentlich keine virtuelle Methode, nicht eine stattdessen Methode, und technisch verhält sich wie eine statische Methode.

Es ist nur, dass die Code-Analyse dieses spezielle Verhalten nicht berücksichtigt.

+0

Haben Sie versucht, 'this.GetType(). Name' zu ​​erzwingen? Entfernt das die Warnung? –