類 (class) 是最基礎的 C# 類型。類是壹個數據結構,將狀態(字段)和操作(方法和其他函數成員)組合在壹個單元中。類為動態創建的類實例 (instance) 提供了定義,實例也稱為對象 (object)。類支持繼承 (inheritance) 和多態性 (polymorphism),這是派生類 (derived class) 可用來擴展和專用化基類 (base class) 的機制。(先給出C#規範文檔中的類定義,呵呵,這個東西要是問起來估計很多人要悶,就和人是什麼之類的問題壹樣。)
像類壹樣,結構 (struct) 是能夠包含數據成員和函數成員的數據結構。但是與類不同,結構是值類型,不需要堆分配。(引用類型總是從托管堆上分配,值類型的實例壹般在線程棧上分配,雖然也作為壹個字段嵌入壹個引用類型的對象中)結構類型的變量直接存儲該結構的數據,而類類型的變量則存儲對動態分配的對象的引用。結構類型不支持用戶指定的繼承(所有的值類型都從System.ValueType派生,都是隱式密封Sealed的),並且所有結構類型都隱式地從類型 object 繼承。
結構對於具有值語義的小型數據結構尤為有用。復數、坐標系中的點或字典中的“鍵-值”對都是結構的典型示例。對小型數據結構而言,使用結構而不使用類會大大節省需要為應用程序分配的內存數量。
結構構造函數也是使用 new 運算符調用,但是這並不意味著會分配內存(值類型的使用緩解了托管堆中的壓力,並減少了壹個應用程序在其生存期內需要進行的垃圾回收次數)。結構構造函數並不動態分配對象並返回對它的引用,而是直接返回結構值本身(通常是堆棧上的壹個臨時位置),然後根據需要復制該結構值。
對於類,兩個變量可能引用同壹對象,因此對壹個變量進行的操作可能影響另壹個變量所引用的對象。對於結構,每個變量都有自己的數據副本,對壹個變量的操作不會影響另壹個變量。
結構的兩個限制。首先,復制整個結構通常不如復制對象引用的效率高,因此結構的賦值和值參數傳遞可能比引用類型的開銷更大。其次,除了 ref 和 out 參數,不可能創建對結構的引用,這樣限制了結構的應用範圍。
上面這段來自C#的規範文檔,清晰而權威。大家也應該看出來了,這個區別與其說是類和結構的區別,不如說是引用類型和值類型的區別。
.NET BCL裏有哪些是類(結構),為什麽它們不是結構(類)?
BCL(Base Class Library)是Dot Net Framework下所有語言使用的類庫(有哪些類和結構,妳就隨便說吧,System名字空間的有多少啊~~個人認為比較需要註意的是DateTime這玩意其實是壹個結構體。)為什麼他們不是結構(類)呢?這道題和下面的小問題其實是壹個問題那就是什麼時候定義結構什麼時候定義類,下面壹並回答。
在自定義類型時,您如何選擇是類還是結構?
除非滿足壹下所有條件,否則不要定義成值類型(結構體)
第壹,類型具有基元類型的行為。類型簡單,其中沒有成員會修改類型的任何實例字段。
第二,類型不需要從其他任何類型繼承。
第三,類型不會派生出其他任何類型。
除了滿足以上全部條件,還必須滿足以下條件中的壹個。
第壹,類型的實例較小(約是16字節或者更小)。
第二,類型實例較大,但不作為方法的實參傳遞,也不通過方法返回。
知道什麼時候應該定義成值類型,不能定義成值類型的場合自然就定義成引用類型。