代码分析 c# .NET CA1822

3

我运行了代码分析并得到了如下信息:

CA1822:Microsoft.Performance:'CreateIntervalString(TimeSpan)' 的 'this' 参数(在Visual Basic中为'Me')从未被使用。如果适用,将成员标记为静态(在Visual Basic中为Shared),或者在方法体或至少一个属性访问器中使用'this'/'Me'。

我的代码如下:

private string CreateIntervalString(TimeSpan timeSpan)
{
    return timeSpan.ToString();
}

据我理解,因为CreateIntervalString函数不使用类的任何成员,仅使用timeSpan输入,VisualStudio建议我将其标记为静态。

我的问题:

  1. 为什么将它标记为静态会提高性能?
  2. 我的函数是库的一部分,应该是线程安全的,将方法标记为静态是否会影响线程安全性?
  3. 我有另外一些仅使用输入而不使用类的任何其他成员的私有函数,但是对它们却没有出现同样的错误提示。

非常感谢!

示例:

以下方法会提供一个错误:

    private string CreateIntervalString(TimeSpan timeSpan)
    { 
          return timeSpan.ToString();
    }

以下内容不包括在内:
    private DateTime ParseDateString(string dateTimeString)
    {
     // the years,monthe,days,hours,minutes and secondes found by the dateTimeString input        
      return new DateTime(years, months, days, hours, minutes, secondes);
    }

请展示您从ParseDateString中删除的代码 - 这可能会提供有关为什么该方法未被标记的线索。 - ClickRick
4个回答

8
MSDN网站http://msdn.microsoft.com/en-us/library/ms245046.aspx提供了性能方面的答案。
如果该方法未标记为静态,则运行时将检查当前对象(this)是否为空。在大多数情况下,这种差异是不明显的,但是如果一个被调用数百万次每秒的方法通过被定义为静态方法可以获得性能提升,那么这可能是值得的。

6
  1. 虽然性能没有提高(在任何重要的方面),但代码变得更加清晰。该方法不会给人一种使用实例的印象,您可以在不创建类的实例的情况下使用该方法。

  2. 由于该方法没有使用实例,因此不会影响线程安全状态。由于该方法仅使用发送到它的数据,因此是线程安全的。

  3. 如果您在方法中实际上使用了某些实例成员,则代码中可能会使用某些实例成员,或者代码中存在使工具认为其使用了实例成员的内容。


4
如果性能没有改进,为什么会显示 Microsoft.Performence 错误?我的功能是私有的,我只在内部类中使用它,所以无论如何我都不应该创建一个实例来使用它吗? - RRR
1
@RRR:嗯,它必须被归类为某种东西,虽然方法调用本身不会影响性能,但是需要创建对象实例。即使您实际上从未需要创建实例来使用该方法,代码分析也不知道这一点,它只能将其规则应用于找到的代码。此外,即使是仅在类内部使用的代码,遵循良好的实践也是更好的选择。 - Guffa
1
是的,但如果我将方法标记为私有的,编译器应该知道我从未在类外部使用它,也永远不应该创建它的实例? - RRR
1
@RRR:不,仅仅将方法设置为私有的并不能得出这样的结论。你仍然可以有一个公共的静态方法来使用这个私有方法,这种情况下它需要创建一个实例来使用它。 - Guffa
微软/编译器团队对于什么构成良好的编程模式和软件设计有着强烈的看法。在这里,我认为遵循没有静态方法和只有对象的风格可能是良好设计的基石。但编译器却说不。 - Prof. Falken

2
  1. 静态函数比非静态函数少一个参数(隐藏的this参数),所以从理论上讲,它们更加高效。
  2. 线程安全与方法是否为静态无关。您可以像使静态方法不安全一样轻松地使实例方法不安全。
  3. 你能否把这些函数发出来让我们看看?

1
在大多数情况下,您不会注意到静态和非静态函数之间的性能差异。理论上,它们不能是虚拟的(并且不将“this”指针作为参数推送)使它们略微更快。但再次强调,这不是您通常会注意到的事情。 静态和线程安全无关。如果方法在"static"之前是线程安全的,则在"static"之后也将是线程安全的。 我以前见过这种情况发生在某些工具中。如果非静态方法使用了其他私有方法,代码分析将假定它们无法被静态化(即使它们没有引用成员)。如果您可以将其他非静态方法更改为静态(如果可以),则可能会收到相同的警告。 希望对您有所帮助, 约翰

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接