C# 什么时候应该将类型或成员声明为静态?

C# 什么时候应该将类型或成员声明为静态?,c#,oop,C#,Oop,static修饰符意味着不能实例化类型,或者成员不能与实例关联。但是这种对实例化的限制有什么好处?在什么用例场景下类型/成员应该声明为静态的 类型声明为静态,以定义不能创建此类型的实例(并且只能包含静态数据) 当方法不引用类的内部数据时,它们在非静态类中是静态定义的。在阅读或使用代码时,了解这一点有时很重要 但是这种对实例化的限制有什么好处?在什么用例场景下类型/成员应该声明为静态的 对于成员,当您拥有属于该类的状态(或应在该类的所有实例之间共享)或不依赖于实例级状态的方法时 对于类型,当您有一

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

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

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

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

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

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

几个好处:

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

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


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

    我遵循以下原则

    在以下情况下声明静态:

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

    • 存在任何并发问题的可能性。私有只读值-实例只能被读取,并且实际上是只读的,因此这些实例可以作为静态常量a-like成员使用,但在其他方面要小心
    • 类之外存在依赖项,即其他内容使用成员或成员使用类型之外的其他内容。这使得测试成为一种痛苦

    因此,主要是增加内聚度,减少耦合,否则使用静态实例就可以了。

    我想我的问题被误解了。我知道静电的作用。但是什么时候限制实例化才有意义呢?在这里进行一点搜索可能会回答您的问题:哦。。谢谢,这在写问题的时候没有出现。要继续,除非有充分的理由,否则成员不应该是静态的。您应该记住,您可能希望在将来的某个时候拥有两份表单、列表等的副本。而且很多静态字段都会助长不良做法,每件事之间都有很多依赖关系。如果你在考虑多线程,你必须知道你在做什么。。我试图通过静态属性仅使“Contextbound”对象可用,例如配置对象。@Onkelberg,您是否将方法或成员不引用对象状态作为一个好的理由?因为如果你这样做了,那么因为如果这不是真的,你不能使它成为静态的,这意味着一个当且仅当规则,它没有为“原因”留下任何空间,不?你可能想修改你的答案,说“引用”一个类的内部数据。而不是“修改”…我将改变这种逻辑:
    static
    (关于成员)应该是默认选项。仅当它不能是静态的时,即当它在逻辑上属于对象的状态时,才将其作为实例。我同意您的说法,即只应实例化属于该状态的成员,但通常不属于对象状态的内容应以某种方式注入,以避免依赖外部状态,你觉得怎么样?-1这解释了怎么做,但不是为什么。OP想知道为什么。