類的構造器沒有返回值,這一點是不言自明的。
靜態構造器初始化類中的靜態變量。靜態構造器不象實例構造器那樣在繼承中被隱含調用,也不可以被用戶直接調用。掌握靜態構造器的要點是掌握它的執行時間。靜態構造器的執行並不確定(編譯器沒有明確定義)。但有四個准則需要掌握:
在一個程序的執行過程中,靜態構造器最多只執行一次。
靜態構造器在類的靜態成員初始化之後執行。或者講編譯器會將靜態成員初始化語句轉換成賦值語句放在靜態構造器執行的最開始。
靜態構造器在任何類的靜態成員被引用之前執行。
靜態構造器在任何類的實例變量被分配之前執行。
看下面例子的輸出:
using System;
class MyClass1
{
static MyClass1()
{
Console.WriteLine("MyClass1 Static Contructor");
}
public static void Method1()
{
Console.WriteLine("MyClass1.Method1");
}
}
class MyClass2
{
static MyClass2()
{
Console.WriteLine("MyClass2 Static Contructor");
}
public static void Method1()
{
Console.WriteLine("MyClass2.Method1");
}
}
class Test
{
static void Main()
{
MyClass1.Method1();
MyClass2.Method1();
}
}
編譯程序並運行可以得到下面的輸出:
MyClass1 Static Contructor
MyClass1.Method1
MyClass2 Static Contructor
MyClass2.Method1
當然也可能輸出:
MyClass1 Static Contructor
MyClass2 Static Contructor
MyClass1.Method1
MyClass2.Method1
值得指出的是實例構造器內可以引用實例變量,也可引用靜態變量。而靜態構造器內能引用靜態變量。這在類與對象的語義下是很容易理解的。
實際上如果我們能夠深刻地把握類的構造器的唯一目的就是保證類內的成員變量能夠得到正確的初始化,我們對各種C#中形形色色的構造器便有會心的理解--它沒有理由不這樣!