我应该多久使用一次静态方法?如果我喜欢:
Class1 _class34 = new Class1(parameter);
Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4).
或
_class34.DoSomething(parameter1, parameter2, parameter3, parameter).
我倾向于调用类的静态方法并像第一个例子一样传递类的对象?
关于这两个例子的最佳做法是什么?我应该注意哪些表现,设计和一般做法?我应该使用哪一个,你会选择哪一个像每天编码场景一样。第一个例子似乎更简单易读(你传递所有参数并做一些事情),在第二个例子中,你必须阅读两次,你正在处理一个对象?
这不是什么大不了的事,只是想知道。
答案 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");
当我想在所有实例之间共享一些类范围的状态信息时,我也使用静态方法(和成员)。
当然,当你的整个班级是静态的时,静态成员是必须的。