7

我应该多久使用一次静态方法?如果我喜欢:

Class1 _class34 = new Class1(parameter);

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

或者

_class34.DoSomething(parameter1, parameter2, parameter3, parameter).

我倾向于调用类的静态方法并像第一个示例中那样传递类的对象?

关于这两个例子的最佳实践是什么?有什么我应该注意的性能、设计和一般做法吗?在日常编码场景中,我应该一般使用哪一个,而你会选择哪一个。第一个示例似乎更易于阅读(您传递所有参数并执行某些操作),在第二个示例中您必须阅读两次您正在处理一个对象?

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

4

7 回答 7

11

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

于 2012-04-08T12:37:38.983 回答
2

没有“更频繁”的答案。
这完全取决于使用的类型。

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

在您的示例中,您正在做Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4)的不是一个好方法,因为它剥夺了面向对象编程为您提供的所有可能性(例如多态性等)。

需要静态函数的场景的一个很好的例子是工厂方法,例如 String.Parse - 它开始时没有任何特定的 String 实例,但连接到字符串类。

于 2012-04-08T12:42:41.950 回答
2

这是运行时已经做的,每个实例方法都有一个隐藏的第一个参数传递this。在扩展方法的语法中公开。

显式地完成运行时的工作并不是特别有用,语法只是变得更加冗长。考虑到你必须想出的那种名字,这很痛苦。考虑 _this 而不是 _class34 :)

于 2012-04-08T12:44:45.083 回答
0

面向对象编程背后的整个想法是,您不必somefunction(somestruct)像过去那样编写,而是可以编写,somestruct.somefunction()这使得somefunction 属于.somestruct

当然,您可以按照您想要的任何方式进行操作,但请记住,您的第二个示例是方式,也是发明成员函数的原因。

于 2012-04-08T12:46:13.503 回答
0

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

在大多数情况下,我最终会为包含静态成员的类添加非静态包装器,否则我将无法模拟它们。

静态方法是可测试性的死亡可能会让您对此有更好的了解。

于 2012-04-08T12:51:53.360 回答
0

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

因此,例如,当我想要一个特殊的创建方法来更清楚地了解创建过程中发生的事情时,我使用静态,比如当我通过从文件反序列化对象来创建对象时:

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

这比以下更具可读性:

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

当我想在所有实例之间共享一些类范围的状态信息时,我也会使用静态方法(和成员)。

当然,当您的整个班级都是静态的时,静态成员是必须的。

于 2012-04-08T13:55:18.153 回答
0

如果你需要这个对象,我认为你应该像“_class34.DoSomething(parameter1,parameter2,parameter3,parameter)”这样的调用。

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

于 2012-04-08T12:38:55.690 回答