C#代码分析CA1822警告 - 为什么?

时间:2010-02-09 14:31:19

标签: c# code-analysis

我有下面显示的方法生成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);
}

6 个答案:

答案 0 :(得分:45)

这意味着您不使用该对象的成员。方法中的所有项都来自参数。

因此,该方法可以安全地保持静态。

答案 1 :(得分:16)

正在使用“reader”,但您并未在任何地方使用“this”,因此您可以将该方法设为静态。

使其成为静态的唯一原因是,如果您想稍后使用多态 - 例如将其虚拟化并将其覆盖在其他地方。

答案 2 :(得分:3)

也许我发现了此邮件的恶意行为。

在像

这样的情况下
void Print()
{
    Console.Writeline(GetType().Name);
}

我报告了此CA1822,但GetType()是实例方法。 但是,我找到了一些解释,为什么GetType()实际上不是虚方法,而不是替代方法,技术上表现得像静态方法。

只是代码Analysis不考虑这种特殊行为。

答案 3 :(得分:2)

我认为它试图告诉你这个方法可以是静态的。

此方法唯一需要访问的是“reader”,但它所属的类实例(“this”)没有任何内容。在这种情况下,您可以安全地使其静止。

答案 4 :(得分:2)

发生警告是因为您不在该方法中使用该类的任何成员变量。 E.g。

this.m_anyVariable = anyValue;

因此,您可以/应该将该方法标记为静态。

答案 5 :(得分:1)

对于像我这样的新手来说,这个代码块会更精确地教授这个主题:

select
  grp,
  value,
  case when count(value) over(partition by grp) = count(*) over (partition by grp) then
    avg(value) over (partition by grp)
  else
    null
  end as average_value
from mytable
order by grp;

在类外调用这些方法时,将使用:

public class MyClass
{
    public int NumThird = 13;

    public static int AddCalc(int NumOne, int NumSecond)
    {
       return NumOne + NumSecond;//no data instance, method could be static
    }
    public int AddVATCalc(int NumOne, int NumSecond)
    {
       return (NumOne + NumSecond) * NumThird;//data instance(NumThird), so not static
    }
}

希望能帮助某人...