我想知道为什么resharper建议在非静态类中使用静态方法? 它是否用于保存实例的创建?这是性能问题吗? 另外,为什么它建议'const'一些参数?这是性能问题吗? 我很乐意得到一些解释
答案 0 :(得分:24)
当编译器遇到静态方法时,它会发出call
条指令,但遇到实例方法时会发出callvirt
条指令。现在callvirt
指令在进行调用之前检查对象是否为null。因此,它会附加性能损失。但它有助于使方法调用多态。
因此,如果该方法与类的任何属性的状态更改无关,建议将该方法设为静态,因为它会提高性能
关于const的使用,它是值的编译时关联,而不是在运行时。所以const的所有变量都被编译时自身的值替换,这显然提高了性能。
答案 1 :(得分:10)
这是一个可读性的问题。当您创建方法static
时,您明确表示它不访问非静态成员变量。如果您标记变量const
,则表明它不能(因此不会)在代码中更改。
答案 2 :(得分:4)
其他答案都是正确的,这只是一个很好的做法。
但我想展示如何它可以让你受益。很多时候,当某个大方法可以变成静态时,它暗示了那里有另一个责任,最好通过为该任务提取另一个对象来处理。
它也可以产生链反应型效应 - 比如说A叫B,都是非静态的。现在Resharper告诉我们B可以变得静止;我们让它做它的事情。现在也许A也可以变得静态。也许A完全是另一个责任 。
在重构旧代码时,这种效果对我来说很方便。它让我看到了责任和要点,我可以在不必为每一寸文字而流汗的情况下剪掉代码。
答案 3 :(得分:2)
静态类不需要实例来调用该类,并且Re sharper足够聪明,可以确定该方法可以是静态的,因此人们可以在没有实例的情况下使用该方法。
如果变量仅用于保存一些实时值,那么最好将它们转换为常量,这样可以避免我们意外更新该变量。这是一个很好的做法,并且Re sharper建议我们一样。
无论如何,如果您不喜欢这些建议,那么您也可以将其关闭。
答案 4 :(得分:1)
这样做是因为它检测到方法体中没有使用类成员变量。
答案 5 :(得分:0)
实际上,我会尽可能地说JetBrains应该删除它们的默认值,以便建议使用const over static readonly。 请在此处阅读:https://www.exceptionnotfound.net/const-vs-static-vs-readonly-in-c-sharp-applications/
总结一下,当您处理多个程序集时,Const变量非常混乱。如果程序集A具有const X,而程序集B使用该X.则必须重新编译程序集B每次组件A更改该X值。 它只是给你一个你不想要的头痛!
谈到速度?嗯...编译器已经成为一种loooooooong方式,非常聪明。从长远来看,从const获得的速度性能可以忽略不计。