C#點滴 – 實值型別與參考型別

來源:互聯網
上載者:User

1. 所有對象都繼承自System.Object,而所有的實值型別都繼承自System.ValueType。也就是說,System.ValueType重寫了System.Object的方法使得實值型別的操作是基於值而不是基於引用。

 

2. 實值型別記憶體配置在棧上,參考型別記憶體配置在託管堆中。記憶體配置在這兩個地方的區別在於:如果超出了實值型別定義的範圍,實值型別分配的記憶體會立刻從記憶體中清除,即它的記憶體生命週期是可以預測的。而參考型別分配在託管堆中,記憶體管理有垃圾處理器控制,不可預知其生命週期。

 

3. 賦值操作

實值型別賦值操作是會依次copy所有成員變數的值。參考型別僅僅是地址重新導向。

 

4. 參數傳遞

預設為值傳遞,即參數為實值型別是傳遞實值型別的值副本,參數為參考型別時傳遞參考型別地址值副本。但當參數使用out或者ref關鍵字是,傳遞的是引用本身。但是在使用ref,需要注意一些區別:

  • 當參數為參考型別時,不使用ref關鍵字,方法還是可以通過傳入的引用改變其所指向的執行個體,但是不能改變引用本身。
  • 當參數為參考型別時,同時使用ref關鍵字,方法可以通過傳入的引用改變其所指向的執行個體,並且改變引用本身。

5. 實值型別是sealed的,不能繼承

 

6. 實值型別不能寫Finalize()方法,該方法用於堆上的記憶體回收。

 

7. 裝箱與拆箱

裝箱 - 把實值型別轉換為參考型別。

拆箱 - 把參考型別轉換為實值型別。

作用:可以把實值型別也看作是對象。最常使用的情況是在集合操作的時候,大多數方法介面都接收一個對象參數(object)。當傳入實值型別時,.NET會自動處理裝箱細節,把實值型別轉變為參考型別。從集合取出時,把參考型別的值取出放回實值型別變數。

缺點:效能上有損失。並且缺少型別安全保證。.NET 2.0推出了泛型 基本上能解決這個問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.