Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
代码分析c#.NET CA1822_C#_Static_Code Analysis - Fatal编程技术网

代码分析c#.NET CA1822

代码分析c#.NET CA1822,c#,static,code-analysis,C#,Static,Code Analysis,我运行代码分析并得到以下消息: CA1822:Microsoft.Performance:中的“this”参数(或“Me”) 从未使用“CreateIntervalString(TimeSpan)”的Visual Basic。做记号 将成员设置为静态(或在Visual Basic中共享)或在中使用“this”/“Me” 方法体或至少一个属性访问器(如果适用) 我的代码是: private string CreateIntervalString(TimeSpan timeSpan) { r

我运行代码分析并得到以下消息:

CA1822:Microsoft.Performance:中的“this”参数(或“Me”) 从未使用“CreateIntervalString(TimeSpan)”的Visual Basic。做记号 将成员设置为静态(或在Visual Basic中共享)或在中使用“this”/“Me” 方法体或至少一个属性访问器(如果适用)

我的代码是:

private string CreateIntervalString(TimeSpan timeSpan)
{
    return timeSpan.ToString();
}
据我所知,由于
CreateIntervalString
函数不使用类的任何成员,只在timeSpan输入上使用,VisualStudio建议我将其标记为静态

我的问题是:

  • 为什么当我将其标记为静态时,性能得到了提高
  • 我的函数是应该是线程安全的库的一部分,作为静态的标记方法可以防止这种情况吗
  • 我有额外的私有函数,只使用它的输入,不在类的任何其他成员上使用,但是我没有得到相同的错误
  • 非常感谢

    示例:

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

        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);
        }
    
  • 静态函数少了一个参数(hidden
    this
    参数),因此从理论上讲,它们的效率更高
  • 线程安全与方法是否为静态无关。可以像静态方法一样轻松地使实例方法线程不安全
  • 你能把这些功能贴出来让我们看看吗
  • 性能没有得到改善(无论以何种方式),但代码变得更加清晰。该方法不会给人留下使用实例的印象,您可以在不创建类实例的情况下使用该方法

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

  • 要么您在方法中实际使用了某个实例成员,要么代码中存在可能使用某个实例成员的内容,要么代码中存在使工具认为它可以使用的内容

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

    MSDN网站给出了性能方面的答案


    如果该方法未标记为static,则运行时将对照null检查当前对象(this)。在大多数情况下,可以观察到的差异很小,这是事实,但如果每秒调用数百万次的方法可以通过静态方式获得增益,那么这是值得的。

    如果性能没有改善,为什么此错误显示为Microsoft.PerformanceError?,而我的函数是private,我只在我的内部类中使用它,所以无论如何,我不应该为了使用它而创建实例…?@RRR:嗯,它必须被归类为某种东西,尽管方法调用本身不会影响性能,但必须创建对象的实例将是一个错误。即使您实际上不需要创建实例来使用该方法,代码分析也不知道这一点,它只能将其规则应用于找到的代码。此外,即使是只在类内部使用的代码,也最好遵循良好的实践。是的,但如果我将方法标记为私有,编译器应该知道我从未在类外部使用过它,也不应该从中创建实例?@RRR:不,这一结论不能仅仅从将方法私有化中得出。您仍然可以有一个使用私有方法的公共静态方法,在这种情况下,它需要创建一个实例来使用它。Microsoft/编译器团队对什么是好的编程模式和软件设计有很强的见解。在这里,我认为遵循一种没有静态方法,只有对象的风格,可以成为良好设计的基石。不,编译器说,请显示从ParseDateString中删除的代码——这可能会提供一个线索,说明为什么没有标记该方法。