類(class)和結(jié)構(gòu)(struct)

? ? ? ? 類和結(jié)構(gòu)是 .NET Framework 中的常規(guī)類型系統(tǒng)的兩種基本構(gòu)造。兩者在本質(zhì)上都屬于數(shù)據(jù)結(jié)構(gòu),封裝著一組整體作為一個邏輯單位的數(shù)據(jù)和行為。數(shù)據(jù)和行為是該類或結(jié)構(gòu)的“成員”,它們包含各自的方法、屬性和事件等.

? ? ? ? 類或結(jié)構(gòu)的聲明類似于藍(lán)圖,用于在運(yùn)行時創(chuàng)建實(shí)例或?qū)ο?。如果定義一個名為Person的類或結(jié)構(gòu),則Person為類型名稱。如果聲明并初始化Person類型的變量p,則p稱為Person的對象或?qū)嵗?梢詣?chuàng)建同一Person類型的多個實(shí)例,每個實(shí)例在其屬性和字段中具有不同的值。

? ? ? ? 類是一種“引用類型”。創(chuàng)建類的對象時,對象賦值到的變量只保存對該內(nèi)存的引用。將對象引用賦給新變量時,新變量引用的是原始對象。通過一個變量做出的更改將反映在另一個變量中,因?yàn)閮烧咭猛粩?shù)據(jù)。

? ? ? ?結(jié)構(gòu)是一種值類型。創(chuàng)建結(jié)構(gòu)時,結(jié)構(gòu)賦值到的變量保存該結(jié)構(gòu)的實(shí)際數(shù)據(jù)。將結(jié)構(gòu)賦給新變量時,將復(fù)制該結(jié)構(gòu)。因此,新變量和原始變量包含同一數(shù)據(jù)的兩個不同的副本。對一個副本的更改不影響另一個副本。

? ? ? ? 類通常用于對較為復(fù)雜的行為建模,或?qū)σ趧?chuàng)建類對象后進(jìn)行修改的數(shù)據(jù)建模。結(jié)構(gòu)最適合一些小型數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)包含的數(shù)據(jù)以創(chuàng)建結(jié)構(gòu)后不修改的數(shù)據(jù)為主。\\\\

? ? ? ? 結(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)在賦值時進(jìn)行復(fù)制。

? ? ? ? 將結(jié)構(gòu)賦值給新變量時,將復(fù)制所有數(shù)據(jù),并且對新副本所做的任何修改不會更改原始副本的數(shù)據(jù)。在使用值類型的集合(如 Dictionary)時,請務(wù)必記住這一點(diǎn)。

? ? ? ?結(jié)構(gòu)是值類型,而類是引用類型。

? ? ? ?與類不同,結(jié)構(gòu)的實(shí)例化可以不使用new運(yùn)算符。

? ? ? ?結(jié)構(gòu)可以聲明帶參數(shù)的構(gòu)造函數(shù)。

? ? ? ? 一個結(jié)構(gòu)不能從另一個結(jié)構(gòu)或類繼承,而且不能作為一個類的基。

? ? ? ? 所有結(jié)構(gòu)都直接繼承自System.ValueType,后者繼承自System.Object。(其實(shí)就是值類型與引用類型的區(qū)別)

? ? ? ? 結(jié)構(gòu)可以實(shí)現(xiàn)接口。

? ? ? ? 結(jié)構(gòu)可用作可以為 null 的類型,因而可向其賦 null 值。

? ? ? ? .NET BCL里有哪些是類(結(jié)構(gòu)),為什么它們不是結(jié)構(gòu)(類)?

? ? ? ? BCL(Base Class Library)是Dot Net Framework下所有語言使用的類庫(有哪些類和結(jié)構(gòu),你就隨便說吧,System名字空間的有多少啊~需要注意的是DateTime這玩意其實(shí)是一個結(jié)構(gòu)體。)為什么他們不是結(jié)構(gòu)(類)呢?這道題和下面的小問題其實(shí)是一個問題那就是什么時候定義結(jié)構(gòu)什么時候定義類,下面一起回答

? ? ? ? 在自定義類型時,您如何選擇是類還是結(jié)構(gòu)?

? ? ? ? struct類型適于表示Point、Rectangle和Color等輕量對象。盡管使用自動實(shí)現(xiàn)的屬性將一個點(diǎn)表示為類同樣方便,但在某些情況下使用結(jié)構(gòu)更加有效。例如,如果聲明一個 1000 個Point對象組成的數(shù)組,為了引用每個對象,則需分配更多內(nèi)存;這種情況下,使用結(jié)構(gòu)可以節(jié)約資源。因?yàn)?.NET Framework 包含一個名為Point的對象,所以本示例中的結(jié)構(gòu)命名為“CoOrds”。復(fù)數(shù)、坐標(biāo)系中的點(diǎn)或字典中的“鍵-值”對都是結(jié)構(gòu)的典型示例。

?除非滿足一下所有條件,否則不要定義成值類型(結(jié)構(gòu)體)

第一,類型具有基元類型的行為。類型簡單,其中沒有成員會修改類型的任何實(shí)例字段。

第二,類型不需要從其他任何類型繼承。

第三,類型不會派生出其他任何類型。

除了滿足以上全部條件,還必須滿足以下條件中的一個。

第一,類型的實(shí)例較小(約是16字節(jié)或者更?。?。

第二,類型實(shí)例較大,但不作為方法的實(shí)參傳遞,也不通過方法返回。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容