一、静态字段
@1、与实例字段一样,可以在声明的同时进行初始化。
@2、与实例字段不同,如果没有对静态字段进行初始化,静态字段将自动获取默认值(0,null,false等)。所以,一个静态字段即使没有被显示地赋值,也可以被访问。
二、静态属性
三、静态方法
@1、this关键字在静态方法中是无效的。因为静态方法不是通过一个特定的实例来引用的。
@2、一般静态方法不能访问类中的实例字段和实例方法,除非事先获得对字段和方法所从属于的那个特定的实例的引用(通过传递参数)。
四、静态构造器
静态构造器用来对类而不是类实例进行初始化。静态构造器并不是显示调用的。”运行时“会在首次访问类(可能是调用一个普通构造器,可能是访问类的一个静态方法或静态字段)时自动调用静态构造器。
我们使用静态构造器将类中的静态数据初始化成一个特定的值,尤其是在无法通过在声明时的一次简单地赋值来获得初始值的时候。
例如: class Employee
{ static Employee()
{ Random randomGenerator=new Randow();
NextId=randomGenerator.Next(101,999);//生成一个100到1000的一个随机整数
}
public static int NextId=42;
}
说明:由于初始值涉及一个方法调用,无法通过在声明时的一次简单地赋值来完成。所以NextId的初始化代码被放到一个静态构造器中,而没有作为声明的一部分。
注意:@1、假如对NextId的赋值既在静态构造器中进行,又在声明时进行,那么当初始化结束的时候,最终获得的是什么值?观察C#编译器生成的CIL代码,发现声明时的赋值被移动了位置,成为静态构造器中的一个语句。因此,在静态构造器中进行的赋值将优先于声明字段时进行的赋值,这会实例字段的情况是一样的。
@2、没有静态终结器的说法。
@3、最好是在声明的同时完成静态初始化,而不要使用静态构造器。
五、静态类
@1、静态类不包含任何实例字段 ,实例方法。当创建一个能实例化的类没有意义是,就可以声明为静态类。
@2、c#编译器会自动在CIL代码中把静态类标记为abstract何sealed。这会将类指定为不可扩展即不能从他派生出其他类。