我有下面显示的方法生成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);
}
答案 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
}
}
希望能帮助某人...