什么是"静态"课程?

Jer*_*y H 40 c# static-classes

在C#中有什么区别:

public static class ClassName {}
Run Code Online (Sandbox Code Playgroud)

和:

public class ClassName {}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 67

首先,对答案的评论询问"静态"是什么意思.在C#术语中,"静态"表示"与类型本身有关,而不是类型的实例".您可以使用类型名称而不是引用或值来访问静态成员(来自其他类型).例如:

// Static method, so called using type name
Guid someGuid = Guid.NewGuid();
// Instance method, called on a value
string asString = someGuid.ToString();
Run Code Online (Sandbox Code Playgroud)

现在,静态类......

静态类通常用作"实用程序"类.可能是典型的例子System.Math.创建一个数学实例是没有意义的 - 它只是"是".一些规则("可以"和"不能"):

  • 静态类总是来源于object.您不能指定不同的基类型,也不能使静态类实现接口.
  • 静态类不能包含任何实例成员 - 所有变量,方法等都必须是静态的.
  • 静态类不能声明任何实例构造函数,并且编译器默认情况下不会创建无参数构造函数.(在静态类进入C#2.0之前,人们经常会创建一个带有私有构造函数的抽象类,这会阻止实例化.这里不需要.)
  • 静态类是隐式抽象的(即它们被编译为IL,它描述了一个抽象类)但是你abstract不能自己添加修饰符.
  • 静态类是隐式密封的(即它们被编译为IL,它描述了一个密封的类)但是你sealed不能自己添加修饰符.
  • 静态类可以是通用的.
  • 静态类可以嵌套在非静态类或静态类中.
  • 静态类可以具有嵌套类型,非静态类型或静态类型.
  • 只有静态的顶级非泛型类可以包含扩展方法(C#3.0).


lms*_*asu 40

静态类无法实例化,并且只能包含静态成员.因此,对静态类的调用如下:MyStaticClass.MyMethod(...)MyStaticClass.MyConstant.

非静态类可以实例化,并且可以包含非静态成员(实例构造函数,析构函数,索引器).非静态类的非静态成员只能通过对象调用:

MyNonStaticClass x = new MyNonStaticClass(...);
x.MyNonStaticMethod(...);
Run Code Online (Sandbox Code Playgroud)

  • 在内部,编译器将类标记为abstract并密封,并在IL代码中创建私有构造函数. (8认同)

Dan*_*ert 6

静态类也不能继承,而具有静态成员的非静态类可以继承.


Sye*_*Ali 6

public static class ClassName {}
Run Code Online (Sandbox Code Playgroud)

静态类就像一个全局变量:您可以在代码中的任何位置使用它而无需实例化它们.例如:ClassName.在点运算符之后,您可以使用它的任何属性或功能.

 public class ClassName {}
Run Code Online (Sandbox Code Playgroud)

但是如果你有非静态类,那么你需要创建这个类的实例.例如:

 ClassName classNameObject = new ClassName(); 
Run Code Online (Sandbox Code Playgroud)


Mar*_*son 5

静态类中的所有方法/属性必须是静态的,而"普通"类可以包含实例和静态方法的混合.