Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么更好?静态方法还是实例方法_C# - Fatal编程技术网

C# 什么更好?静态方法还是实例方法

C# 什么更好?静态方法还是实例方法,c#,C#,我发现有两种类型的方法称为静态方法和实例方法及其区别。 但我仍然不明白两者之间的优势 有时我觉得静态方法不是100%面向对象的 这两者之间有什么性能差异吗 有人能帮忙吗?实例方法需要传递一个隐式参数(this引用),这使得它们比静态方法稍慢一些。但这真的不应该成为选择它们的理由 有关相关讨论,请参阅: 我根据C#的传统部分猜测,但我怀疑它与其他OO语言是一样的 静态方法不需要处理对象。一个很好的例子是: Double pi = Math.PI. 实例方法确实需要一个对象。例如: Integer

我发现有两种类型的方法称为静态方法和实例方法及其区别。 但我仍然不明白两者之间的优势

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

这两者之间有什么性能差异吗


有人能帮忙吗?

实例方法需要传递一个隐式参数(this引用),这使得它们比
静态方法稍慢一些。但这真的不应该成为选择它们的理由

有关相关讨论,请参阅:


我根据C#的传统部分猜测,但我怀疑它与其他OO语言是一样的

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

Double pi = Math.PI.
实例方法确实需要一个对象。例如:

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

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

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

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


如果你的类中没有非静态的数据成员,有时最好的做法是将所有的方法都设置为静态的(比如为了良好的顺序将助手函数分组到一个类下)。

在一个完美的OO世界中,可能不需要任何静态方法(我认为Eiffel也没有静态方法)。但归根结底,重要的不是代码的OO纯粹性(C#有足够多的概念不是严格意义上的OO,比如扩展方法),而是你正在做什么

您可以将静态方法用于常规帮助器方法(它们本身不需要常规帮助器类或状态)或诸如Color.FromARGB()之类的东西,它们的行为与值类型的构造函数稍有相似


一般来说,任何不涉及对象状态的方法(因此更特定于类而非对象)都可以被设置为静态的。性能差异不应该真的出现。在任何情况下都不是很可测量的。Jan Gray的伟大文章中有一些关于这方面的硬数据,尽管要小心。

静态方法的有用性主要来自于当您需要调用该方法而不需要实例化对象时。例如,静态方法可能用于实际查找现有实例并返回它(一个示例是单例实例)

正如其他人所说,如果任何方法不访问状态,您可以使其成为静态的,并且您将获得一点性能改进

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


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

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

所有这些都只是一堆问题,你应该问你的代码,并确定它是一个更好的实例方法,一个相同类的静态方法还是另一个类的静态方法


我甚至不会考虑性能问题。这会削弱你的设计,差别其实并没有那么大。如果您有性能问题,性能很重要

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


所以我看不出一个比另一个更好的理由

请注意,只有当您试图在非常缓慢的平台上或在一秒钟内完成数百次时,才应考虑速度参数。我猜您使用的是>2GHz的双核处理器。成员函数调用和静态函数调用之间的速度差异不应该成为设计标准。是的,即使在速度慢得多的平台上,也不应该成为设计考虑因素(正如我在回答中所说)。我只是注意到了性能上的差异,因为这是特别要求的。即使在一个“纯OO世界”,我也不知道如何使Math.Cos实例方法“更OO”。对于这类实用方法,具有N个参数的静态方法与具有N-1个参数的实例方法在概念上没有区别,其中“this”被理解为第一个参数(“Math.Cos(double)”与“double.Cos()”)。