Answers:
静态方法与实例方法
10.2.5 C#语言规范的静态和实例成员解释了两者之间的区别。通常,静态方法与实例方法相比只能提供很小的性能增强,但是仅在某些极端情况下(有关此问题的更多详细信息,请参见此答案)。
FxCop或代码分析中的规则CA1822指出:
“在[将成员标记为静态]之后,编译器将向这些成员发出非虚拟调用站点,这将阻止在运行时检查每次调用,以确保当前对象指针为非空。这可以带来可观的性能提升对于性能敏感的代码。在某些情况下,无法访问当前对象实例表示正确性问题。”
实用
程序类除非在您的设计中有意义,否则不要将它们移至实用程序类。如果静态方法与特定类型相关,就像ToRadians(double degrees)
方法与表示角度的类相关,则将该方法作为该类型的静态成员存在是有意义的(请注意,出于演示目的,这是一个复杂的示例)。
在我看来,性能,名称空间污染等都是次要的。问问自己什么是合乎逻辑的。该方法是在逻辑上对类型的实例进行操作,还是与类型本身相关?如果是后者,则使其成为静态方法。如果它与不受您控制的类型相关,则仅将其移至实用程序类。
有时也有其逻辑上作用于一个实例,但不要发生在使用任何实例的状态的方法还没有。例如,如果您正在构建文件系统,并且已经有了目录的概念,但是尚未实现它,则可以编写一个返回文件系统对象类型的属性,并且该属性总是“文件”-但在逻辑上与实例相关,因此应该是一个实例方法。如果要使方法虚拟化,这也很重要-您的特定实现可能不需要状态,但是派生类可能需要状态。(例如,询问集合是否为只读-您可能尚未实现该集合的只读形式,但这显然是集合本身的属性,而不是类型。)
我确定这不会在您的情况下发生,但是我在某些代码中看到的一种“难闻的气味”使我不得不通过维护来使用大量的静态方法。
不幸的是,它们是假定特定应用程序状态的静态方法。(为什么可以确定,每个应用程序只能有一个用户!为什么User类不能在静态变量中跟踪该用户?)它们是访问全局变量的美化方法。他们也有静态构造函数(!),这几乎总是一个坏主意。(我知道有两个合理的例外)。
但是,当静态方法排除实际上不依赖于对象实例状态的域逻辑时,它们非常有用。它们可以使您的代码更具可读性。
只要确保将它们放在正确的位置即可。静态方法是否会干扰其他对象的内部状态?可以很好地说明他们的行为属于这些类之一吗?如果您没有适当地分离问题,那么以后您可能会头疼。
有趣的是:
http://thecuttingledge.com/?p=57
ReSharper实际上并不建议您将方法设为静态。您应该问自己为什么该方法在该类中而不是在其签名中显示的类之一中...
但是这是reshaper文档所说的:http : //confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static
您应该在给定的情况下执行最易读和直观的操作。
性能参数不是一个好参数,除非在最极端的情况下,因为实际发生的唯一事情是this
实例方法将一个额外的参数()压入了堆栈。
将方法设为静态意味着您可以从类外部调用该方法,而无需先创建该类的实例。在使用第三方供应商对象或附加组件时,这很有用。想象一下,如果您必须先创建一个控制台对象“ con”,然后再调用con.Writeline();。
它有助于控制名称空间污染。
Class.a_core_function( .. )
vsa_core_function( .. )
希望您已经了解了静态方法和实例方法之间的区别。另外,答案可能很长,答案很短。其他人已经提供了长答案。
我的简短回答:是的,如果Resharper建议,您可以将它们转换为静态方法。这样做没有害处。相反,通过使该方法静态化,实际上是在保护该方法,从而不必使任何实例成员都不必滑入该方法。这样,您可以实现OOP原则“ 最小化类和成员的可访问性 ”。
当ReSharper建议实例方法可以转换为静态方法时,它实际上是在告诉您:“为什么..此方法位于此类中,因为它实际上并未使用其任何状态?” 因此,它为您提供了深思的地方。然后,您可以意识到是否需要将该方法移至静态实用程序类。根据SOLID原则,一个班级应该只承担一个核心责任。因此,您可以通过这种方式更好地清理类。有时,即使在实例类中,您也确实需要一些辅助方法。如果是这种情况,您可以将它们保留在#region帮助器中。