当咱们想初始化一些静态变量的时候,就须要用到静态构造函数了。这个静态构造函数属于类,而不属于实例,就是说这个构造函数只会被执行一次,即:在建立第一个实例或引用任何静态成员以前,由.NET自动调用。函数
如今碰到这样一个场景:提供一个静态方法,这个静态方法在不一样的地方使用,涉及到一个参数值不一样,而其余内容都彻底一致。若是是将静态方法的内容复制出来作成另一个方法,代码冗余太多,作法不可取。使用静态构造函数处理静态变量,则能够尽最大程度简化代码。以下示例:spa
/// <summary> /// 基类 /// </summary> public class A { public static string Field = "original-test"; //静态构造函数 static A() { Field = "test-a"; } public static void Test() { Console.WriteLine("the output is : " + Field); } } /// <summary> /// 子类 /// </summary> public class B : A { //静态构造函数 static B() { Field = "test-b"; } public static new void Test() { A.Test();//调用基类方法,这个对基类Test函数的覆盖很重要,没有这个,那么调用B.Test()的时候实际上是调用基类的Test方法。
} }
如代码所示,类型B继承于基类型A。B中的静态构造函数对静态变量Field进行赋值,这个会在调用子类中的Test方法以前调用,而B中Test方法的实现则是彻底调用基类A的Test方法,这样,在方法执行的时候,方法中使用的静态变量Field的值就是在B的静态构造函数中赋值以后的test-b。code
调用结果以下:blog
static void Main(string[] args) { A.Test();//输出the output is : test-a B.Test();//输出the output is : test-b Console.ReadLine(); }
A.Test()调用,Field值为test-a;而B.Test()调用,Field值为test-b。继承
这样,当静态方法的实现逻辑复杂的时候,就能够针对须要将这个方法进行个性化实现的需求的时候简化代码:子类在静态构造函数中对静态变量从新赋值,而后从新实现基类中的静态方法。string
(注意,后面的从新实现基类中的静态方法是必须的,不然输出B.Test()的时候,调用基类的Test()方法,使用的Field变量则是基类中的变量,那时输出则变成以下:)it
static void Main(string[] args) { A.Test();//输出the output is : test-a B.Test();//输出the output is : test-a。由于没有覆盖子类方法,等同于A.Test() Console.ReadLine(); }