使用静态方法与对象方法

时间:2012-04-08 12:35:52

标签: c#

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

Class1 _class34 = new Class1(parameter);

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

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

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

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

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

7 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

如果你需要这个对象,我想你应该像这样打电话 “_class34.DoSomething(parameter1,parameter2,parameter3,parameter)。”

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

答案 4 :(得分:0)

面向对象编程背后的整个想法是,您不必像过去那样编写somefunction(somestruct),但您可以编写somestruct.somefunction()代替,这样可以更加清晰somefunction 属于somestruct

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

答案 5 :(得分:0)

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

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

Static Methods are Death to Testability可能会让您更好地了解这一点。

答案 6 :(得分:0)

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

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

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

哪个更具可读性:

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

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

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