其實在介紹Struct之前,我們應對C#關於類(Class)的原理進行初步的研究。但是,從另一個方面,我們也可以先對這個與類有著血緣關系的結構進行探討以獲得對類的進一步的認識。
首先,C#的結構是一個關系重大的語言功能。和類一樣,結構也可以包含其他類型。由於結構在內部是值類型的,所以結構有時也被稱為類的輕型版本。同時,結構不承擔引用對象所帶來的開銷,除非在對其裝箱時例外。
結構也有其重要的限制,所以導致他只能用於非常特殊的場合。 以下就討論他們的局限性和他的優點。
結構的定義和類的定義基本上是一致的:
[attributes][modifIErs] struct
[:interfaces]
{
[struct-body]
}[;]
為了便於理解,我舉個實例來展開論述。我們首先定義一個描述具體事物的結構體——"611311班"。
struct STUClass{
public string ClassName;
public object ClassMumber;
public int ClassNumber;
}
到目前為止,這個聲明很像一個類。但是,下面你將看到在使用結構方面的許多限制。
客戶不必對結構進行實例化(通過new關鍵字)。這是因為,作為一種值類型,結構一旦被聲明,就被分配。
但是正是有了這種用法,所以我們如果不親自對結構的成員進行顯式的初始化(使用new關鍵字),那麼字段就不會被初始化。如下面這段代碼,編譯將會出錯:
STUClass s611311;
Console.WriteLine(s611311.ClassName);
以下的代碼將會糾正這個錯誤。注意,因為s611311.ClassName 是一個值類型,所以初始化模認為 0 ;
STUClass s611311 = new STUClass();
Console.WriteLine(s611311.ClassName);
我所知的結構成員包括構造器、常量、字段、方法、特性、索引器、操作符等類型。但是,在構造器方面,結構有個非常重要的限制:不能位結構創建無參數的構造器。
所以,以下代碼不能編譯通過:
struct STUClass{
public STUClass();
public string ClassName;
public object ClassMember;
public int ClassNumber;
}
但是,我們可以利用帶有參數的構造器原型來定義:
struct STUClass{
public STUClass(string name,object menber,int number)
{
ClassName = name;
ClassMember = menber;
ClassNumber = number;
}
public string ClassName;
public object ClassMember;
public int ClassNumber;
}
如果仔細研究一下定義結構的語法,會注意到其中沒有基類的列表。這是由於結構不能基於其他結構或類,而且他們也不能作為其他結構或類的基。如果希望看到更加直觀的結論,你最好到.Net 開發環境中分別定義一個具有相同成員的類和結構,然後到編譯器產生的MSIL中去比較一下。
從中我們可以得出一下結論:1、結構的定義是封閉的(不能作為基類使用);2、結構隱式地派生自System.ValueType,
而System.ValueType是所有值類型的超類型(終極基類)。3、結構沒有默認的構造器。
(欲知使用結構的原則和例程,且看下回分曉...)