關(guān)于C#中的結(jié)構(gòu)
2024-07-21 02:25:34
供稿:網(wǎng)友
其實(shí)在介紹struct之前,我們應(yīng)對(duì)c#關(guān)于類(class)的原理進(jìn)行初步的研究。但是,從另一個(gè)方面,我們也可以先對(duì)這個(gè)與類有著血緣關(guān)系的結(jié)構(gòu)進(jìn)行探討以獲得對(duì)類的進(jìn)一步的認(rèn)識(shí)。
首先,c#的結(jié)構(gòu)是一個(gè)關(guān)系重大的語言功能。和類一樣,結(jié)構(gòu)也可以包含其他類型。由于結(jié)構(gòu)在內(nèi)部是值類型的,所以結(jié)構(gòu)有時(shí)也被稱為類的輕型版本。同時(shí),結(jié)構(gòu)不承擔(dān)引用對(duì)象所帶來的開銷,除非在對(duì)其裝箱時(shí)例外。
結(jié)構(gòu)也有其重要的限制,所以導(dǎo)致他只能用于非常特殊的場(chǎng)合。 以下就討論他們的局限性和他的優(yōu)點(diǎn)。
結(jié)構(gòu)的定義和類的定義基本上是一致的:
[attributes][modifiers] struct <structname> [:interfaces]
{
[struct-body]
}[;]
為了便于理解,我舉個(gè)實(shí)例來展開論述。我們首先定義一個(gè)描述具體事物的結(jié)構(gòu)體——"611311班"。
struct stuclass{
public string classname;
public object classmumber;
public int classnumber;
}
到目前為止,這個(gè)聲明很像一個(gè)類。但是,下面你將看到在使用結(jié)構(gòu)方面的許多限制。
客戶不必對(duì)結(jié)構(gòu)進(jìn)行實(shí)例化(通過new關(guān)鍵字)。這是因?yàn)椋鳛橐环N值類型,結(jié)構(gòu)一旦被聲明,就被分配。
但是正是有了這種用法,所以我們?nèi)绻挥H自對(duì)結(jié)構(gòu)的成員進(jìn)行顯式的初始化(使用new關(guān)鍵字),那么字段就不會(huì)被初始化。如下面這段代碼,編譯將會(huì)出錯(cuò):
stuclass s611311;
console.writeline(s611311.classname);
以下的代碼將會(huì)糾正這個(gè)錯(cuò)誤。注意,因?yàn)閟611311.classname 是一個(gè)值類型,所以初始化模認(rèn)為 0 ;
stuclass s611311 = new stuclass();
console.writeline(s611311.classname);
我所知的結(jié)構(gòu)成員包括構(gòu)造器、常量、字段、方法、特性、索引器、操作符等類型。但是,在構(gòu)造器方面,結(jié)構(gòu)有個(gè)非常重要的限制:不能位結(jié)構(gòu)創(chuàng)建無參數(shù)的構(gòu)造器。
所以,以下代碼不能編譯通過:
struct stuclass{
public stuclass();
public string classname;
public object classmember;
public int classnumber;
}
但是,我們可以利用帶有參數(shù)的構(gòu)造器原型來定義:
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;
}
如果仔細(xì)研究一下定義結(jié)構(gòu)的語法,會(huì)注意到其中沒有基類的列表。這是由于結(jié)構(gòu)不能基于其他結(jié)構(gòu)或類,而且他們也不能作為其他結(jié)構(gòu)或類的基。如果希望看到更加直觀的結(jié)論,你最好到.net 開發(fā)環(huán)境中分別定義一個(gè)具有相同成員的類和結(jié)構(gòu),然后到編譯器產(chǎn)生的msil中去比較一下。
從中我們可以得出一下結(jié)論:1、結(jié)構(gòu)的定義是封閉的(不能作為基類使用);2、結(jié)構(gòu)隱式地派生自system.valuetype,
而system.valuetype是所有值類型的超類型(終極基類)。3、結(jié)構(gòu)沒有默認(rèn)的構(gòu)造器。
(欲知使用結(jié)構(gòu)的原則和例程,且看下回分曉...)