代码分析c#.NET CA1822

时间:2011-06-26 11:50:19

标签: c# static code-analysis

我运行代码分析并收到此消息:

  

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

我的代码是:

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

据我所知,因为CreateIntervalString函数不使用该类的任何成员,并且仅在timeSpan输入上使用,所以VisualStudio建议我将其标记为静态。

我的问题:

  1. 为什么当我将其标记为静态时,性能会提高?
  2. 我的函数是应该是线程安全的库的一部分,将标记方法作为静态防止这个吗?
  3. 我有额外的私有函数只使用它的输入,并没有在类的任何其他成员中使用,但我没有得到相同的错误。
  4. 非常感谢!

    示例:

    以下方法提供错误:

        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);
        }
    

4 个答案:

答案 0 :(得分:6)

  1. 性能没有得到改善(无论如何重要),但代码变得更加清晰。该方法不会让人觉得它使用了实例,您可以在不创建类实例的情况下使用该方法。

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

  3. 要么在方法中实际使用某个实例成员,代码中有一些东西可能会使用某个实例成员,或者代码中有一些东西让该工具认为它有。

答案 1 :(得分:5)

MSDN网站http://msdn.microsoft.com/en-us/library/ms245046.aspx提供了性能方面的答案

如果方法未标记为static,则运行时将检查当前对象(this)是否为null。在大多数情况下,几乎没有可观察到的差异,这是真的,但如果一种被称为每秒数百万次的方法可以通过静态获得这种收益,那么它就值得。

答案 2 :(得分:1)

  1. 静态函数只有一个参数(隐藏的this参数),所以理论上它们更有效。
  2. 线程安全与您的方法是否为静态无关。您可以像使用静态方法一样轻松地使实例方法线程不安全。
  3. 你能否发布一些这些功能给我们看?

答案 3 :(得分:0)

  1. 在大多数情况下,您不会注意到静态和非静态功能之间的性能差异。从理论上讲,它们不能是虚拟的(并且不会将“this”指针作为参数推送)会稍微加快一点。但同样,不是你通常会注意到的事情。
  2. 静态和线程安全无关。如果该方法在“静态”之前是线程安全的,那么在“静态”之后它将是线程安全的。
  3. 我之前用一些工具看过这个。如果非静态方法使用其他私有方法,则代码分析将假定它们不能成为静态(即使它们不引用成员)。如果您将其他非静态方法更改为静态(如果可以),那么它可能会给您相同的警告。
  4. 希望有所帮助, 约翰