struct和class區別的背后
2007/1/22 21:35:23

結構與類共享幾乎所有相同的語法,但結構比類受到的限制更多:
1、盡管結構的靜態字段可以初始化,結構實例字段聲明還是不能使用初始值設定項。
2、結構不能聲明默認構造函數(沒有參數的構造函數)或析構函數。
3、結構的副本由編譯器自動創建和銷毀,因此不需要使用默認構造函數和析構函數。實際上,編譯器通過為所有字段賦予默認值(參見默認值表)來實現默認構造函數。結構不能從類或其他結構繼承。
4、結構是值類型——如果從結構創建一個對象并將該對象賦給某個變量,變量則包含結構的全部值。復制包含結構的變量時,將復制所有數據,對新副本所做的任何修改都不會改變舊副本的數據。由于結構不使用引用,因此結構沒有標識--具有相同數據的兩個值類型實例是無法區分的。C# 中的所有值類型本質上都繼承自 System.ValueType,后者繼承自 Object。
編譯器可以在一個稱為裝箱的過程中將值類型轉換為引用類型。
結構具有以下特點:  結構是值類型,而類是引用類型。  向方法傳遞結構時,結構是通過傳值方式傳遞的,而不是作為引用傳遞的。  與類不同,結構的實例化可以不使用 new 運算符。  結構可以聲明構造函數,但它們必須帶參數。  一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。  所有結構都直接繼承自 System.ValueType,后者繼承自 System.Object。  結構可以實現接口。 
在結構中初始化實例字段是錯誤的。


----------------------------------------------------------------------------------------
以上是引用的MSDN的說法。
現在引出問題
1、如果結構是值類型,但是結構成員可以是類,也就是說這個時候結構怎么分配內存呢?
  結構的副本由編譯器自動創建和銷毀,也就是說結構在編譯的時候就確定了存儲空間了,不是在運行時到托管堆里面去分配內存。所以結構成員的類成員其實是保存的這個類的實例的地址。
2、那struct的new操作又是干什么的呢?
操作就是執行initobj指令,功能就是將位于指定地址的對象的所有字段初始化為空引用或適當的基元類型的0。如果是類的話實例化new的指令實際是newobj instance。所以class的new操作和struct的new操作是不一樣的。
像下面這個結構
publicstruct TestStruct 
{
public int n; 
public string s; 
public StringBuilder sb; 
當他
TestStructt = new TestStruct(); 
new的時結果是什么?其結果就是int類型被初始化為0,對象全部被置為null。
結論
struct的new操作是不執行分配內存操作的,其new操作只執行初始化數據操作。所以微軟關于new關鍵字的用途的說法是不全面的。因為new還有一種只初始化數據而不在托管堆分配內存的功能。所以值類型和引用類型的實質我個人認為其實就是在什么時候分配內存和其傳值調用方式。
注1
MSDN對new關鍵字用途的說法:
(1)new運算符
用于創建對象和調用構造函數。
(2)new修飾符
用于向基類成員隱藏繼承成員。
(3)new約束
用于在泛型聲明中約束可能用作類型參數的參數的類型。

注2
System.ValueType本來就是比較怪的一個東西。
.NET的編譯器在處理他的時候是
1、把值存在計算堆棧上,這個是值類型的標準操作。
2、產生一個裝箱操作如果初始化的是一個33這樣的整數,那就裝箱一個int32同理如果是3.3就是float。
3、執行一個stloc從計算堆棧的頂部彈出當前值并將其存儲到指定索引處的局部變量列表中。
個人理解:System.ValueType更像是一個系統內置接口。而接口在平臺當中不管是Java還是.NET都意味著一旦繼承了這種系統內置接口,就會響應系統內部的某種處理或調用。

返回列表
返回首頁 主站蜘蛛池模板: 中文字字幕在线| 美女网站色在线观看| a级片免费在线观看| 91亚洲导航深夜福利| 六月丁香色婷婷| 视频在线观看国产| 99久久精品这里只有精品| 国自产精品手机在线观看视频| 日韩不卡在线视频| 好看的中文字幕在线| 好男人在线社区www我在线观看| 国产精品视频一区二区噜噜| 国产精品久久久久无码av| 国产成人a视频在线观看| 国产一级做a爰片在线| 同桌一直在夹腿还嗯啊的叫| 国产三级久久精品三级| 亚洲热妇无码av在线播放| 国产无吗一区二区三区在线欢| 可以免费看污视频的网站| 亚洲免费在线视频播放| 免费视频88av在线| 亚洲av无码片在线观看| yellow版字幕网| 国产福利在线导航| 狠狠躁夜夜躁人人爽天天天天97 | 亚洲精品成人a在线观看| 久久久久免费精品国产小说| a级国产乱理伦片| 荡女安然的yin乱生活| 真实乱l仑全部视频| 日韩在线免费播放| 国色天香论坛社区在线视频| 国产女人精品视频国产灰线| 亚洲色欲www综合网| 久久久久久久伊人电影| g0g0人体全免费高清大胆视频| 国产超爽人人爽人人做| 男人扒开女人下面狂躁动漫版| 日本全黄三级在线观看| 国产色在线视频|