說說struct。對於struct,在一定程度上與class非常相像,分析一下:
class program
{
static void Main(string[] args)
{
STR str1;
str1.Method("str1");//第一種方法,直接定義
STR str2 = new STR();
str2.Method("str2"); //第二種方法,通過new關鍵字
}
}
struct STR
{
public void Method(string Par)
{
Console.WriteLine("參數是:"+Par);
}
}
一個是直接定義來調用,也可以通過new關鍵字來定義調用,這是與類不同的,類必需經過執行個體化(new)來定義調用(靜態成員是通過類名調用,沒有定義)。
接下來再看一個例子。
class program
{
static void Main(string[] args)
{
STR str1;//第一種
str1.count = 100;//賦值
Console.WriteLine(str1.count);
STR str2 = new STR();//第二種
Console.WriteLine(str2.count);
}
}
struct STR
{
public int count;
}
當結構體中定義一個全域變數時(類中叫欄位),這個count是沒有值的,這是與類不同的,在類中,所有的欄位都有預設值,結構中是沒有的。既然沒有預設值,那在第二種執行個體化直接調用時,str2.count輸出的為什麼是0,這個0是沒有事前賦值的。如果是類,我們知道,類是有建構函式的,如果我們不顯式寫上建構函式,CLR會自動給我們加上一個沒有參數的建構函式的,並且這個建構函式是可以被顯式的寫出來的。同樣,結構也是有一個建構函式,但這個建構函式是不能夠寫出來的,並且這個建構函式很特別,從第二種就能看出,只要用new關鍵字來執行個體化結構,就會把count給初始化成0,也就是那個不能寫出來的無參建構函式會初始化所有的結構中的全域變數。對於第一種,因為沒有調用無參的建構函式,所以必需去顯式的給結構中的全域變數去賦值。
如果結構裡有有參建構函式,代碼如下:
class program
{
static void Main(string[] args)
{
STR str = new STR("");//執行個體化
Console.WriteLine(str.count);
}
}
struct STR
{
public int count;
public STR(string str)
{
count = 1;
}
}
會發現,如果是個有參建構函式,在構造中必需去初始化結構中的全域變數,因為如果用有參建構函式的話,無參的就不會得到調用,結構中的全域變數就得不到初始化,所以必需在有參建構函式中去初始化它。如果有多個全域變數,都得在這個有參建構函式中去執行個體化它們。