1. 結(jié)構(gòu)體簡介
結(jié)構(gòu)體使用struct
關(guān)鍵字定義的
public struct StructName
{
// 字段 屬性 方法 事件
}
struct
類型適用于表示輕量級對象涩澡,如 Point、Rectangle 和 Color坠敷。 盡管用類也可以實(shí)現(xiàn)妙同,但在某些情況下,使用結(jié)構(gòu)可能更高效膝迎。 例如粥帚,如果你聲明具有 1000 個(gè) Point對象的數(shù)組,那么你將分配額外的內(nèi)存用于引用每個(gè)對象限次;在這種情況下芒涡,使用結(jié)構(gòu)將更為方便。
struct Location
{
public int x;
public int y;
public int z;
public Location(int x, int y, int z)
{
this.x = x;
this.z = z;
this.y = y;
}
}
static void Main(string[] args)
{
Location loc1 = new Location(5, 6, 7);
Location loc2 = new Location(5, 6, 7);
Location loc3;
loc3.x = 5;
loc3.y = 6;
loc3.z = 7;
Console.WriteLine(loc1.x + loc2.y +loc3.z);
}
2. 使用結(jié)構(gòu)體注意點(diǎn)
定義結(jié)構(gòu)的默認(rèn)(無參數(shù))構(gòu)造函數(shù)是錯(cuò)誤的卖漫。 在結(jié)構(gòu)體中初始化實(shí)例字段也是錯(cuò)誤的费尽。 在聲明結(jié)構(gòu)后,只能通過使用參數(shù)化構(gòu)造函數(shù)或通過逐個(gè)訪問成員才可以初始化結(jié)構(gòu)成員羊始。 任何私有或其他不可訪問的成員只能在構(gòu)造函數(shù)中進(jìn)行初始化旱幼。
使用
new
運(yùn)算符創(chuàng)建結(jié)構(gòu)對象時(shí),將會創(chuàng)建結(jié)構(gòu)對象且會調(diào)用相應(yīng)的構(gòu)造函數(shù)突委。 與類不同柏卤,可以對結(jié)構(gòu)進(jìn)行實(shí)例化,而無需使用new
運(yùn)算符匀油。 在這種情況下缘缚,沒有調(diào)用任何構(gòu)造函數(shù),從而提高了分配效率钧唐。 但是忙灼,字段將保持為未分配狀態(tài)且必須在在初始化所有字段之后才可使用對象。一個(gè)結(jié)構(gòu)無法繼承自另一個(gè)結(jié)構(gòu)或類,并且它不能為類的基類该园。 但是酸舍,它可以從基類
Object
繼承。 結(jié)構(gòu)也可以實(shí)現(xiàn)接口里初,且實(shí)現(xiàn)方法與類相同啃勉。不能使用關(guān)鍵字 struct聲明一個(gè)類。 在 C# 中双妨,類和結(jié)構(gòu)在語義上是不同的淮阐。 結(jié)構(gòu)是值類型,而類是引用類型刁品。
將較小的類聲明為結(jié)構(gòu)泣特,可以提高系統(tǒng)的處理效率。
3. 結(jié)構(gòu)與類
結(jié)構(gòu)與類共享大多數(shù)相同的語法挑随,但結(jié)構(gòu)比類受到的限制更多:
- 在結(jié)構(gòu)聲明中状您,除非字段被聲明為
const
或static
,否則無法初始化兜挨。 - 結(jié)構(gòu)不能聲明默認(rèn)構(gòu)造函數(shù)(沒有參數(shù)的構(gòu)造函數(shù))或析構(gòu)函數(shù)膏孟。
- 結(jié)構(gòu)在賦值時(shí)進(jìn)行復(fù)制。 將結(jié)構(gòu)賦值給新變量時(shí)拌汇,將復(fù)制所有數(shù)據(jù)柒桑,并且對新副本所做的任何修改不會更改原始副本的數(shù)據(jù)。 在使用值類型的集合(如 Dictionary<string, myStruct>)時(shí)噪舀,請務(wù)必記住這一點(diǎn)魁淳。
- 結(jié)構(gòu)是值類型,而類是引用類型傅联。
- 與類不同先改,結(jié)構(gòu)的實(shí)例化可以不使用
new
運(yùn)算符。 - 結(jié)構(gòu)也可以聲明帶參數(shù)的構(gòu)造函數(shù)蒸走。
- 一個(gè)結(jié)構(gòu)不能從另一個(gè)結(jié)構(gòu)或類繼承,而且不能作為一個(gè)類的基貌嫡。 所有結(jié)構(gòu)都直接繼承自
System.ValueType
比驻,后者繼承自System.Object
。 - 結(jié)構(gòu)也可以實(shí)現(xiàn)接口岛抄。
- 結(jié)構(gòu)可用作可以為
null
的類型别惦,因而可向其賦null
值。