一、結構(struct)是cts中五種基本型別之一,是一種值型別,同樣封裝了同屬乙個邏輯單元的資料和行為,這些資料和行為通過結構中的成員表示;結構與類共享大多數相同的語法,但結構比類受到的限制更多,結構適用於表示輕量級型別;使用struct關鍵字定義結構:
//定義乙個公共結構mystruct
public
class
mystruct
}
1.所有結構都直接隱式繼承自system.valuetype,不能再指定繼承自其它任何結構或類,即結構不支援繼承,但可以實現乙個或多個介面,同時結構也是隱式密封的,不能被繼承;
※將結構型別的物件強制轉換為其所實現的任何介面型別或object型別時會導致裝箱操作,此時會將結構型別的物件包裝到託管堆記憶體上的引用型別物件內;
2.由於結構不支援繼承,因此結構不能被定義為abstract或sealed;
3.結構不能被定義為靜態的,但可以宣告靜態成員;
4.由於結構不支援繼承,因此結構成員只能宣告為public、internal或private的,不能宣告為abstract、virtual和sealed;
※對於例項成員,不能在結構宣告中直接對其進行初始化;
※對於靜態成員,可以在宣告時進行初始化,也可以在靜態建構函式中對其初始化;
※結構中不能宣告預設建構函式(無引數的建構函式),結構的預設建構函式由編譯器保留,並一直處於可用狀態,其作用是申請指定大小的記憶體空間,並將所有位元組初始化為0(即default(t));
※結構中可以宣告帶引數的自定義建構函式,自定義建構函式的方法體中必須對所有的例項成員進行初始化,否則編譯器會報錯,私有例項成員只能在建構函式中進行初始化;
※結構不存在析構階段,不能宣告析構函式;
publicstruct
mystruct
static
mystruct()
}
二、可以通過呼叫預設建構函式、自定義建構函式、使用物件初始化器或在宣告結構之後單獨初始化成員的方式構建結構例項;
1.使用運算子new或運算子default構建結構例項,並呼叫對應的建構函式:
mystruct mystruct = new mystruct(); //呼叫結構的預設建構函式,此時mynum為0,mystr為null
mystruct = default(mystruct); //
與使用new mystruct()完全等效
mystruct = new mystruct(1, "
1"); //
呼叫結構的自定義建構函式
2.與類不同,結構的例項化可以不使用new運算子,此時不會呼叫任何建構函式,也不會初始化任何例項成員,記憶體分配效率提高,在訪問某個例項字段之前對該字段初始化即可:
mystruct mystruct; //構建結構例項,但不呼叫建構函式
mystruct.mynum = 1
;int mynum = mystruct.mynum; //
訪問某個例項成員之前需要對其初始化
※通常適用於只使用結構中部分例項字段進行儲存和操作的情況;
※只有當所有的例項欄位都初始化完成後,才能呼叫其實例方法或將其用作引數、返回值;
※結構中存在私有例項欄位時也可以使用此種方式構建結構例項,但也意味著不能初始化完成其所有例項字段;
三、結構是值型別,變數和資料放在一起,對結構型別的變數進行賦值、傳遞引數、方法返回等操作時都會產生新的變數,並會複製(即淺拷貝)原變數中的所有資料到新變數中,對新變數所做的任何修改都不會改變原變數的資料,只能將新變數重新賦值給原變數,在處理值型別的集合(如list)時需要格外注意這點:
//當需要修改值型別集合中某個元素的資料時,需要先拿乙個變數接收,修改完成後再賦值給集合
mystruct mystruct = mystructlist[0
];mystruct.mynum = 20
;mystructlist[
0] = mystruct;
1.結構型別可用作可空型別,此時依然是值型別,可空型別的變數可賦值為null;
mystruct? mystruct = null;
四、自定義結構的最佳實踐:
publicstruct mystruct : iequatable//
實現iequatable介面用於泛型
mystruct other = (mystruct)obj; //
拆箱return
this
.equals(other);
}public
override
int gethashcode() //
避免使用雜湊集合類時裝箱並提供高效實現
public
override
string tostring() //
避免裝箱
public
bool equals(mystruct other) //
避免比較時實參裝箱,避免使用泛型時裝箱
public
static
bool
operator ==(mystruct left, mystruct right) //
比較時通常採用==運算子
public
static
bool
operator !=(mystruct left, mystruct right)
}
※如果需要進行大小比較,還應該實現介面icomparable並過載運算子<=和》=;
出處:
c 物件導向程式設計 物件導向
什麼是物件導向 是對現實世界理解和抽象的方法。物件導向程式設計的特點 易維護,易擴充套件,靈活性好,重用 類 對事物的抽象定義,即事物具有的共同特徵和行為。物件 即對類進行例項 類是抽象的,物件是具體的 類的定義 語法 訪問修飾符 class 類名類的成員 包括字段,屬性,方法,常量,事件和索引器等...
C 物件導向
它定義了類的物件包括了什麼屬性,以及可以執行哪些操作 呼叫函式 class box 關鍵字 public 確定了類成員的訪問屬性.在類物件作用域內,類的外部是可訪問的 也可以指定類的成員為 private 或 protected box box1 宣告物件 box1,型別為 box box box2...
c 物件導向
0,類變數的申明可以不賦初始值 int 型別的為0,引用型別預設值為null,bool型別為false 1.物件導向的三大特點 封裝 0增加安全 1 良好的封裝能夠減少耦合 2 類內部的實現可以自由地修改 3 類具有清晰的對外介面 繼承 子類是乙個物件,父類的成員只是子類的引用 在繼承時子類的訪問修...