对于我正在编写的应用程序,我希望具有极端的可扩展性,并且扩展方法似乎能够提供我想要的内容,以及在没有实例的情况下调用它们的能力,我也需要它。
我记得读过静态方法比实例方法更快但没有得到GC的优点。这是对的吗?
我不太可能改变我的设计,除非我找到一个优秀的替代设计而不是速度。但是仍然需要额外的信息,我想知道速度,GC等方面的差异。
编辑:谢谢。更多信息:假设我们有一个Person类:class Person
可以有一个实例Distance方法,如:
this.Distance (Person p)
这很好,但这并不能让我计算2点之间的距离(比如Point3),而不会创建Person类的实例。
我想做的是:
class Person (no Distance methods)
但是距离的扩展方法:
Distance (this Person, Person)
Distance (this Point3, Point3)
这样我可以这样做:
myPerson.Distance (yourPerson)
和
Extensions.Distance (pointA, pointB)
EDIT2:@Jon,是的,我认为这就是所谓的(不要获得GC的优势),但我不知何故认为静态方法会造成这种负担/开销。
答案 0 :(得分:14)
在静态和实例方法之间进行选择是面向对象设计的问题。如果您正在编写的方法是对象的行为,那么它应该是一个实例方法。如果它不依赖于对象的实例,则它应该是静态的。
基本上,静态方法属于一种类型,而实例方法属于一种类型的实例。
答案 1 :(得分:13)
“不要获得GC的优势”是什么意思?方法不是垃圾收集 - 实例是。
虚拟方法稍微比非虚拟方法慢,我想在任何实例方法之前都有那个讨厌的空检查,但它并不重要。选择最合适的设计。
静态方法很难进行测试 - 例如,如果您通过调用某种静态方法在方法Foo()
中进行身份验证,那么当您测试Foo()
时,您无法进行调用模拟身份验证器(除非静态方法本身允许您这样做)。但是,如果您给出了正在测试某个包含Authenticate()
方法的接口的模拟实现的原始实例,那么您可以根据需要使其运行。
编辑:在这种情况下,听起来你真正需要的是Point
类型上的实例方法来计算两点之间的距离(“这个”和另一个点) - 或者可能是静态工厂方法在Distance
类型。
答案 2 :(得分:5)
如果速度更快,则意味着方法中的代码执行得更快,然后没有。静态方法中的代码与非静态方法中的代码一样快。
如果你在谈论执行方法调用的开销,那就变得有点复杂了。对于Java而言,实例调用具有更多开销。但是在C#中并非如此,因为默认情况下实例方法不是虚拟的。
因此,虚拟方法的开销略高于非虚方法。静态方法不能是虚拟的,但实例方法可以声明为虚拟。
对于垃圾收集,这主要与字段有关,而不是方法。可以从代码中的任何位置访问静态字段,因此垃圾收集器无法确定是否将再次使用该引用,因此永远不会收集它。
答案 3 :(得分:2)
根据你的例子,我会写一个静态效用函数来找到两点之间的距离:
public static class Geometry
{
public static double GetDistanceBetween(Point a, Point b) { ... }
}
然后我会给Person一个名为Position的属性返回一个点。所以我可以写:
double distance = Geometry.GetDistanceBetween(personA.Position, personB.Position);
它实际上已经是英文 - 为什么让它更加模糊?如果你使Distance成为一个方法,那么你可以写:
personA.Distance(personB)
或:
personB.Distance(personA)
这两个排序之间没有区别,但是使用方法调用语法表明可能存在差异。