何时使用静态方法'在C#中

时间:2014-02-14 10:13:44

标签: c# asp.net

我的C#代码中有一堆(可能是10到15个)方法,所有这些方法都是“静态”。显然,所有这些都是使用ClassName调用的。一切顺利。但是,这样使用它们有什么优点/缺点吗?如果我的方法不使用“静态”,我会获得任何性能上的好处吗?

5 个答案:

答案 0 :(得分:4)

从技术上讲,使用静态方法时会有轻微的性能优势,因为在执行方法时不需要将实例引用加载到堆栈。但这是一个很小的优化,你不会注意到。

从编程的角度来看,静态方法难以模拟,它们会在代码中引入强大的耦合。使用静态方法时,您也会失去抽象和多态的好处。

您可以从不使用实例数据的实例方法创建静态私有方法。但是公共静态方法通常会给你带来模拟和依赖注入的问题,所以通常我会避免它们。一个例外是用于创建类实例的工厂方法 - Loan.CreateLongTermLoan(因此您不能在C#中使用自定义名称的构造函数,但是您需要一些描述已创建实例的详细信息的描述性名称)或{{1} }。

答案 1 :(得分:2)

如果您担心静态方法对实例方法的性能优势,那么您将进行微优化,毫无疑问会过早地进行优化。在担心这类事情之前,你应该担心良好的课堂设计!

如果你的方法不能在一个实例的状态下运行,那么它们就是静态方法的理想选择。例如,工厂方法显然是使用静态方法。

如果你有方法操作实例的状态,那么它们需要是实例(非静态)方法。例如,更改成员变量的方法不能是静态的。

仅供参考:在IL级别,所有实例方法都通过CallVirt指令调用,即使它们不是虚拟的。如果在空引用上调用方法,这允许运行时生成NullReferenceException。通过Call指令调用静态方法。

答案 2 :(得分:1)

静态与非静态没有性能优势。

如果您不需要方法中的类的实例,那么它就是被标记为static的候选者。

答案 3 :(得分:1)

当您需要子类时,静态方法的问题就出现了。

静态方法无法在子类中重写,因此新类无法提供方法的新实现,从而降低了它们的用途。

答案 4 :(得分:1)

这是概念性问题。方法......

  • 属于特定实例?然后它不是静止的。
  • 属于而不属于特定实例?然后它是静止的主要候选人。

请注意,静态方法无法访问对象的实例成员(非静态成员)。