代码之家  ›  专栏  ›  技术社区  ›  explorer

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

  •  2
  • explorer  · 技术社区  · 14 年前

    这个 static 修饰符意味着类型不能实例化,或者成员不能与实例关联。但是这种对实例化的限制有什么好处,在什么用例场景下类型/成员应该声明为静态的呢?

    5 回复  |  直到 14 年前
        1
  •  4
  •   jason    14 年前

    但是这种对实例化的限制有什么好处,在什么用例场景下类型/成员应该声明为静态的呢?

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

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

        2
  •  0
  •   Mark Robinson    14 年前

    几个好处:

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

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

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

        4
  •  0
  •   testalino    14 年前

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

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

        5
  •  0
  •   Almund    14 年前

    我遵循以下原则。

    声明静态条件:

    • 需要 静态访问(尽管要注意这一点,因为它创建了非常硬的依赖关系),我通常只允许对控制访问器和简单功能助手(如System.Math)进行静态访问。
    • 您绝对不希望类被实例化,并且应该只作为单个实例(singleton)存在,例如在上面的助手或IOC容器的情况下。

    在以下情况下不要声明静态:

    • 有任何并发问题的可能。私有只读值-实例只能被读取,并且实际上是只读的,因此这些实例可以作为静态类常量成员使用,但另外要小心。
    • 类外部存在依赖项,即其他某些项使用成员或成员使用类型外部的其他项。这让测试很痛苦。

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