我发现有两种类型的方法称为静态方法和实例方法及其差异.但我仍然无法理解一个人的优势.
有时我觉得静态方法不是100%面向对象的.
这两者之间是否有任何性能差异.
有人可以帮忙吗?
在完美的面向对象世界中,可能不需要静态方法(我认为埃菲尔也没有它们).但是在一天结束时,重要的不是你的代码的纯粹性(C#有足够的概念,不是严格纯粹的OO,比如扩展方法),而是你要做的事情.
您可以将静态方法用于一般辅助方法(不需要自己的常规辅助类或状态)或类似Color.FromARGB()的方法,它们对于值类型行为略微类似于构造函数.
通常,任何不接触对象状态的方法(因此比特定于对象的类更具体)都可以是静态的.不应该出现性能差异.无论如何,不是很可衡量.Jan Gray的精彩文章编写更快的托管代码:知道什么是成本有一些硬数据,尽管要小心谨慎.
静态方法的用处主要是当您需要调用方法而不实例化对象时。例如,也许静态方法实际上是在那里查找现有实例并返回它(一个例子是单例实例)。
正如其他人所说,如果任何方法不访问状态,您可以将其设为静态,并且您将获得微小的性能改进。
如果您确实希望能够在特定实例上调用该方法,并获得多态的好处(即派生类可以覆盖该方法的行为),那么您应该将其设为实例方法。
如果您的类实现了接口,则属于这些接口的方法也必须声明为实例方法。
实例方法与实例紧密相关。所以你可以看到静态方法的一个优点是不紧缩实例。其他对象可以(如果可见)使用静态方法来解决它们的问题。有时这很好,需要。然后,您必须考虑将静态方法保留在同一个类中,或者您是否开始构建实用程序类以供更广泛的使用。我不会看到使用静态方法是“少面向对象”。静态方法是规避 OO 缺点的一种方法(尤其是在单继承语言中)。你可以称之为更实用的方法(我知道它不是真的)。
所有这些只是一堆问题,您应该询问您的代码,并确定它是实例方法、同一类的静态方法还是另一个类的静态方法更好。
我什至不会考虑性能问题。它会削弱您的设计,而且差异并不是那么大。如果您遇到性能问题,性能很重要。
实例方法需要传递隐式参数(this
引用),这使得它们比static
方法稍微慢一些。但这确实不应该成为选择它们的理由。
相关讨论请参见: