当前位置:  开发笔记 > 编程语言 > 正文

C#中的静态方法与实例方法

如何解决《C#中的静态方法与实例方法》经验,为你挑选了3个好方法。

对于我正在编写的应用程序,我希望具有极端的可扩展性,并且扩展方法似乎能够提供我想要的内容,以及在没有实例的情况下调用它们的能力,我也需要它.

我记得读过静态方法比实例方法更快但没有得到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的优势),但我不知何故认为静态方法会产生这种负担/开销.



1> Mehrdad Afsh..:

在静态和实例方法之间进行选择是面向对象设计的问题.如果您正在编写的方法是对象的行为,那么它应该是实例方法.如果它不依赖于对象的实例,则它应该是静态的.

基本上,静态方法属于一种类型,而实例方法属于一种类型的实例.



2> Jon Skeet..:

你是什​​么意思"没有得到GC的优势"?方法不是垃圾收集 - 实例是.

虚拟方法比非虚拟方法慢,我猜在任何实例方法之前都存在令人讨厌的空检查,但它并不重要.选择最合适的设计.

静态方法是一种测试的痛苦 - 例如,如果你Foo()通过调用一些静态方法在方法中进行身份验证,那么当你进行测试时,Foo()你不能只调用一个模拟身份验证器(除非静态方法本身允许你这样做) ).但是,如果您给出了正在测试某个包含Authenticate()方法的接口的模拟实现的原始实例,那么您可以根据需要使其运行.

编辑:在这种情况下,听起来你真正需要的是你的Point类型上的实例方法来计算两点之间的距离("这个"和另一个) - 或者可能是Distance类型上的静态工厂方法.



3> DefLog..:

如果速度更快,则意味着方法中的代码执行得更快,然后没有.静态方法中的代码与非静态方法中的代码一样快.

如果你在谈论执行方法调用的开销,那就变得有点复杂了.对于Java而言,实例调用具有更多开销.但是在C#中并非如此,因为默认情况下实例方法不是虚拟的.

因此,虚拟方法的开销略高于非虚方法.静态方法不能是虚拟的,但实例方法可以声明为虚拟.

至于垃圾收集,这主要与字段有关,而不是方法.可以从代码中的任何位置访问静态字段,因此垃圾收集器无法确定是否将再次使用该引用,因此永远不会收集它.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有