何时应将类型或成员声明为静态?

时间:2010-10-19 13:20:10

标签: c# oop

static修饰符表示无法实例化类型或成员无法与实例关联。但是这种限制对实例化有什么好处,在什么用例情况下应该将类型/成员声明为静态?

5 个答案:

答案 0 :(得分:4)

  

但是这个限制对实例化有什么好处,在什么用例情况下应该将类型/成员声明为静态?

对于成员,当您拥有属于该类的状态(或应该在该类的所有实例之间共享)或不依赖于实例级状态的方法时。

对于类型,当你有一包不依赖于实例级状态的方法(例如,System.Math)时,包括扩展方法。

答案 1 :(得分:0)

类型被声明为static以定义,不能创建此类型的实例(并且只能包含静态数据)。

当非静态类不引用类的内部数据时,方法在静态类中定义。在阅读或使用代码时,这有时很重要。

答案 2 :(得分:0)

有几个好处:

  1. 使用较少的内存,因为不需要实例化对象来调用方法
  2. 允许全局访问属性/成员(尽管需要考虑线程问题)
  3. 向调用者指示该方法是类的一个方面,而不是对OOP有影响的对象实例。

答案 3 :(得分:0)

当您希望编译器禁止实例化该类型的实例时,应将类型声明为静态,并防止添加任何非静态(基于实例的)成员。所有这一切都保证您以后不会无意中添加非静态成员。

非静态类的成员应声明为静态 If和Only If 成员不引用任何基于实例的对象状态,(直接或间接通过另一个非静态)会员)。它们不能引用该类型的任何非静态成员,但非静态成员可以引用它们。

答案 4 :(得分:0)

我遵循以下原则。

声明静态if:

  • 需要静态访问(请注意这一点,因为它创建了非常硬的依赖项),我通常只允许Inversion of Control访问者和简单功能助手(例如System.Math)的静态访问< / LI>
  • 您绝对不希望您的类被实例化,并且只应作为单个实例(单例)存在,例如在上面的帮助器或IoC容器中

如果出现以下情况,请不要声明静态:

  • 有可能出现并发问题。私人只读值 - 实例只能读取,并且实际上是只读的,所以这些都可以像静态常量一样好,但要小心谨慎。
  • 类外存在依赖关系,即其他东西使用该成员,或者成员使用该类型之外的其他东西。这使测试成为一种痛苦。

所以主要是增加内聚力减少耦合,否则你可以使用静态实例。