web-dev-qa-db-ja.com

C#コード分析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."

'reader'パラメーターが実際に使用されているのに、なぜこの警告が表示されるのか誰かに教えてもらえますか?

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

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

   ParseFile.IVAFile(lines);
}
35
Randy Minder

これは、オブジェクトのメンバーを使用しないことを意味します。メソッド内のすべての項目はパラメーターから取得されます。

したがって、メソッドを安全に静的にすることができます。

49
Jeff Foster

「reader」が使用されていますが、「this」はどこにも使用されていないため、メソッドを静的にすることができます。

静的にする唯一の理由notは、後でポリモーフィズムを使用したい場合です-例:それを仮想化し、他の場所でオーバーライドします。

18
Jon Skeet

たぶん私はこのメッセージの悪意のある振る舞いを見つけました。

のような状況で

_void Print()
{
    Console.Writeline(GetType().Name);
}
_

GetType()はインスタンスメソッドですが、この_CA1822_が報告されます。しかし、GetType()が実際には仮想メソッドではなく、代わりのメソッドではなく、技術的には静的メソッドのように動作する理由について、いくつかの説明を見つけました。

コード分​​析がこの特別な動作を考慮していないというだけです。

4
Holger

このメソッドは静的にできることを伝えようとしていると思います。

このメソッドがアクセスする必要があるのは「リーダー」だけですが、それが属するクラスインスタンス(「this」)からは何もアクセスできません。その場合、安全に静的にすることができます。

2
Rob Levine

そのメソッドでそのクラスのメンバー変数を使用していないため、警告が発生します。例えば。

this.m_anyVariable = anyValue;

したがって、そのメソッドを静的としてマークすることができます/すべきです。

2
Simon Linder