? ? ? ? 類和結(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)的聲明類似于藍圖命咐,用于在運行時創(chuàng)建實例或?qū)ο蟆H绻x一個名為Person的類或結(jié)構(gòu)谐岁,則Person為類型名稱醋奠。如果聲明并初始化Person類型的變量p,則p稱為Person的對象或?qū)嵗恋琛窜司?梢詣?chuàng)建同一Person類型的多個實例,每個實例在其屬性和字段中具有不同的值航揉。
? ? ? ? 類是一種“引用類型”塞祈。創(chuàng)建類的對象時,對象賦值到的變量只保存對該內(nèi)存的引用帅涂。將對象引用賦給新變量時议薪,新變量引用的是原始對象尤蛮。通過一個變量做出的更改將反映在另一個變量中,因為兩者引用同一數(shù)據(jù)斯议。
? ? ? ?結(jié)構(gòu)是一種值類型产捞。創(chuàng)建結(jié)構(gòu)時,結(jié)構(gòu)賦值到的變量保存該結(jié)構(gòu)的實際數(shù)據(jù)捅位。將結(jié)構(gòu)賦給新變量時轧葛,將復(fù)制該結(jié)構(gòu)搂抒。因此艇搀,新變量和原始變量包含同一數(shù)據(jù)的兩個不同的副本。對一個副本的更改不影響另一個副本求晶。
? ? ? ? 類通常用于對較為復(fù)雜的行為建模焰雕,或?qū)σ趧?chuàng)建類對象后進行修改的數(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)不能聲明默認構(gòu)造函數(shù)(沒有參數(shù)的構(gòu)造函數(shù))或析構(gòu)函數(shù)空幻。
? ? ? ? 結(jié)構(gòu)在賦值時進行復(fù)制烁峭。
? ? ? ? 將結(jié)構(gòu)賦值給新變量時,將復(fù)制所有數(shù)據(jù)秕铛,并且對新副本所做的任何修改不會更改原始副本的數(shù)據(jù)约郁。在使用值類型的集合(如 Dictionary)時,請務(wù)必記住這一點但两。
? ? ? ?結(jié)構(gòu)是值類型鬓梅,而類是引用類型。
? ? ? ?與類不同谨湘,結(jié)構(gòu)的實例化可以不使用new運算符绽快。
? ? ? ?結(jié)構(gòu)可以聲明帶參數(shù)的構(gòu)造函數(shù)。
? ? ? ? 一個結(jié)構(gòu)不能從另一個結(jié)構(gòu)或類繼承紧阔,而且不能作為一個類的基坊罢。
? ? ? ? 所有結(jié)構(gòu)都直接繼承自System.ValueType,后者繼承自System.Object寓辱。(其實就是值類型與引用類型的區(qū)別)
? ? ? ? 結(jié)構(gòu)可以實現(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這玩意其實是一個結(jié)構(gòu)體蕉朵。)為什么他們不是結(jié)構(gòu)(類)呢?這道題和下面的小問題其實是一個問題那就是什么時候定義結(jié)構(gòu)什么時候定義類阳掐,下面一起回答
? ? ? ? 在自定義類型時始衅,您如何選擇是類還是結(jié)構(gòu)?
? ? ? ? struct類型適于表示Point缭保、Rectangle和Color等輕量對象汛闸。盡管使用自動實現(xiàn)的屬性將一個點表示為類同樣方便,但在某些情況下使用結(jié)構(gòu)更加有效艺骂。例如诸老,如果聲明一個 1000 個Point對象組成的數(shù)組,為了引用每個對象钳恕,則需分配更多內(nèi)存别伏;這種情況下,使用結(jié)構(gòu)可以節(jié)約資源忧额。因為 .NET Framework 包含一個名為Point的對象厘肮,所以本示例中的結(jié)構(gòu)命名為“CoOrds”。復(fù)數(shù)睦番、坐標(biāo)系中的點或字典中的“鍵-值”對都是結(jié)構(gòu)的典型示例类茂。
?除非滿足一下所有條件,否則不要定義成值類型(結(jié)構(gòu)體)
第一抡砂,類型具有基元類型的行為大咱。類型簡單,其中沒有成員會修改類型的任何實例字段注益。
第二碴巾,類型不需要從其他任何類型繼承。
第三丑搔,類型不會派生出其他任何類型厦瓢。
除了滿足以上全部條件,還必須滿足以下條件中的一個啤月。
第一煮仇,類型的實例較小(約是16字節(jié)或者更谢阎佟)浙垫。
第二,類型實例較大,但不作為方法的實參傳遞夹姥,也不通過方法返回杉武。