2012-04-08 68 views
7

我应该多长时间使用静态方法?如果我有这样的:使用静态方法与对象方法

Class1 _class34 = new Class1(parameter); 

Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4). 

_class34.DoSomething(parameter1, parameter2, parameter3, parameter). 
我在调用类的静态方法,并在第一个例子中传递类的对象一样的趋势

这两个例子的最佳做法是什么?我应该注意哪些表现,设计和一般实践?我应该一般使用哪一个,哪一个会在每天的编码场景中选择。第一个例子看起来更简单(你传递所有参数并做一些事情),在第二个例子中你必须读两遍你正在处理一个对象?

这不是什么大事,只是想知道。

回答

11

一般来说,静态方法应该只在任何你想做的事情独立于类的任何一个实例时使用。如果您需要直接访问或影响特定实例的状态,则通常需要使用非静态方法。

+1

同意。当然,总是有例外,但通常情况下,如果您发现自己将A类的实例传递给A类的静态方法,那么您可能会做错了。 – 2012-04-08 21:22:15

+0

如果您将两个A类实例传递给实例“拥有”或在操作中优先的方法,那么情况如何? – 2012-04-09 15:51:48

+1

你的意思是像一个可交换的二元操作?我已经看到了这两种方式,但可能仍然使用非静态方法。 – Taymon 2012-04-10 03:42:15

0

如果您需要该对象,我认为您应该拨打电话 “_class34.DoSomething(parameter1,parameter2,parameter3,parameter)”。

当你读到它就像:在对象_Class34上做某事,用这个参数。

2

没有“更经常”的答案。
这一切都取决于使用的类型。

的底线是:如果指定的类的对象实现/使用,你应该总是使用非静态方法。 但是,如果没有单个实例被影响/使用,则应始终使用静态方法。

在你的榜样,你正在做的Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4)这是不是一个好方法,因为它除掉一切准备面向对象编程的给你(如多态等)。

一个很好的例子,其中用于将需要的静态功能的情况是工厂方法,如String.Parse - 这开始没有字符串的任何特定实例,但连接到字符串类。

+0

另一个常见的例子是从文件中加载一个对象 - 这通常作为静态返回从文件加载的对象。 – Ricibob 2012-04-08 12:44:46

2

这是运行时已经这样做,每个实例方法的优点在于传递一个隐藏的第一个参数。暴露在扩展方法的语法中。

明确做运行时的工作是不是特别有用,语法只是变得更详细。痛苦的给了你必须提出的名字。考虑_this而不是_class34 :)

0

面向对象编程背后的全部想法是,您不必像过去那样编写somefunction(somestruct),而是可以编写somestruct.somefunction()来代替,这使得它更清晰即somefunction所属的somestruct

当然你可以用任何你想要的方式来做,但是请记住,你的第二个例子是的方式,这是发明成员函数的原因。

0

静态成员可能会使单元测试复杂化,因此您必须小心使用它们。

对于大多数情况,我最终为包含静态成员的类添加了非静态包装器,否则我将无法嘲笑它们。

Static Methods are Death to Testability可能会给你一个更好的想法。

0

但默认情况下,我使用实例方法。 我倾向于仅在比实例方法更有意义或者没有其他方式时才使用静态。使用静态可能会使单元测试复杂化。也使用静态字段的静态方法是内存泄漏的潜在来源(即使在.NET中也是如此)。

因此,例如我用静态时,我想有一个特殊的制作方法制作更加清晰创建过程中发生了什么,当我通过从文件反序列化它创建对象,如:

MyClass myObject = MyClass.ReadFromFile("serialized.xml"); 

哪个更可读比:

MyClass myObject = new MyClass("serialized.xml"); 

另外我使用静态方法(和成员),当我想共享一些全班级的状态信息之间的所有实例。

当然,静态成员是必须的,当你的整个类是静态的。