什么是更好的? 静态方法或实例方法

我发现有两种类型的方法称为静态方法和实例方法及其差异。 但我仍然无法理解一个人的优势。

有时我觉得静态方法不是100%面向对象的。

这两者之间是否有任何性能差异。

有人可以帮忙吗?

在一个完美的面向对象世界中,可能不需要静态方法(我认为埃菲尔也没有它们)。 但是在一天结束时,重要的不是你的代码的纯粹性(C#有足够的概念,不是严格纯粹的OO,比如扩展方法),而是你要做的事情。

您可以将静态方法用于一般辅助方法(不需要自己的常规辅助类或状态)或类似Color.FromARGB()的方法,它们对于值类型表现得略微类似于构造函数。

通常,任何不接触对象状态的方法(因此比特定于对象的类更具体)都可以是静态的。 不应该真正出现性能差异。 无论如何,不​​是很可衡量。 Jan Gray的精彩文章编写更快的托管代码:知道什么是成本有一些硬数据,尽管要小心谨慎。

静态方法的用处主要是在需要调用方法而不实例化对象时。 例如,静态方法可能实际上是查找现有实例并返回它(一个例子是单例实例)。

正如其他人所说,如果不访问状态,你可以使任何方法静态,你将获得微小的性能提升。

如果您确实希望能够在特定实例上调用该方法,并获得多态的好处(即派生类可以覆盖该方法的行为),那么您应该将其作为实例方法。

如果您的类实现接口,那么属于这些接口的方法也必须声明为实例方法。

实例方法对实例来说很紧张。 因此,您可以看到静态方法的一个优点是对实例不紧密。 静态方法可以(如果可见)被其他对象用来解决它们的问题。 有时这很好,也很需要。 然后,您必须考虑将静态方法保留在同一个类中,或者如果您开始构建实用程序类以供更广泛使用。 我不会看到使用静态方法“少OO”。 静态方法是避免OO缺点的一种方法(特别是在单inheritance语言中)。 你可以称之为更实用的方法(我知道它不是真的)。

考虑到所有这些只是一堆问题,你应该问你的代码,并确定它是否更好的实例方法,同一个类的静态方法或另一个类的静态方法。

我甚至不会考虑性能问题。 它会削弱你的设计,差异并不是那么大。 如果遇到性能问题,性能很重要。

实例方法需要传递一个隐式参数( this引用),这使得它们比static方法稍慢。 但这真的不应该是喜欢它们的理由。

有关相关讨论,请查看:

*可以*静态的C#方法应该是静态的吗?

如果您的方法使用非静态数据成员,请不要将其设置为静态(您“不能”)。

如果你的方法不使用任何非静态数据成员,你可以使它静态,但这主要取决于你的设计,而不是它是否使用非静态成员(无论如何,性能没有太大差异,如Mehrdad所说)。

如果您的类中没有非静态数据成员,有时最好将所有方法设置为静态(例如,为了良好的顺序将辅助函数分组在一个类下)。

我部分猜测基于C#的遗产,但我怀疑它与其他OO语言相同。

静态方法不需要对象来处理。 一个很好的例子是这样的:

 Double pi = Math.PI. 

实例方法确实需要一个对象。 一个例子是:

 Integer x = 9; Integer y = x.sqrt(); 

并非属于某个类的所有信息都需要为该类实例化的对象才能访问它。 所有可用于创建对象的常量( Math.PIWindow.OVERLAPPED等)都是这方面的主要例子。

没有人比另一个好。 这真的取决于你的要求。 如果要将更改作为整体应用于类,则会调用类方法。 当您不将更改应用于类而是应用于该类的唯一实例(对象)时,将调用实例方法。

所以我没有看到为什么一个人应该比另一个更好的原因。