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

时间:2009-05-17 10:59:16

标签: c#

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

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

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

有人可以帮忙吗?

7 个答案:

答案 0 :(得分:6)

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

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

通常,任何不接触对象状态的方法(因此比特定于对象的类更具体)都可以是静态的。不应该出现性能差异。无论如何,不​​是很可衡量。 Jan Gray的精彩文章Writing faster managed code: Know what things cost有一些关于此的硬数据,尽管要小心谨慎。

答案 1 :(得分:4)

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

正如其他人所说的那样,如果任何方法不能访问状态,你可以将它设置为静态,并且你的性能会有很小的提升。

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

有关相关讨论,请查看:

Should C# methods that *can* be static be static?

答案 4 :(得分:2)

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

如果您的方法不使用任何非静态数据成员,您可以将其设置为静态,但这主要取决于您的设计,而不是取决于它是否使用非静态成员(无论如何,性能没有太大差异正如迈赫达德所说的那样)。

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

答案 5 :(得分:1)

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

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

Double pi = Math.PI.

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

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

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

答案 6 :(得分:1)

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

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