程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 引用類型和值類型,

C# 引用類型和值類型,

編輯:C#入門知識

C# 引用類型和值類型,


C# 引用類型和值類型

CLR支持兩種類型:引用類型和值類型。

1.引用類型

(1)內存必須從托管堆上分配;

(2)堆上分配的每個對象都有一些額外成員(包括“類型對象指針”,“同步塊索引”),這些成員必須初始化;

(3)對象的其他字節總是設為零;

(4)從托管堆分配對象時,可能強制執行一次垃圾回收。

2.值類型

(1)一般在線程棧上分配;

(2)不受垃圾回收器控制;

3.兩者的區別

(1)值類型的兩種表示形式:未裝箱和已裝箱,引用類型都是已裝箱;

(2)值類型從System.ValueType派生,提供了與System.Object相同的方法,但是重寫了Equals和GetHashCode方法;

(3)由於值類型不能作為基類型,所以不應在值類型中使用虛方法;

(4)引用類型包含堆中對象的地址,默認為null;

(5)將值類型變量賦值給另外一個值類型變量,會復制每個字段的值,而引用類型則只復制內存地址,所以改變值類型的復制對象不會影響原值,但是引用類型會改變原值;

(6)由於未封裝的值類型不在堆上分配,如果分配後該類型的事例不再活動,其內存就會被釋放。

4.裝箱

定義:將值類型轉換成引用類型。

(1):在堆內存中分配值類型各字段所需的內存加上額外成員(類型對象指針和同步塊索引)所需的內存;

(2):值類型的字段復制到新分配的對內存;

(3):返回對象地址。

5.拆箱

定義:將引用類型轉換為值類型。

(1):獲取已裝箱事例的各字段值;

(2):將字段包含的值從堆復制到棧的值類型。

注意:

(1):如果已裝箱事例的引用為null,拋出NullReferenceException異常;

(2):如果引用的對象不是所需值類型的已裝箱實例,拋出InvalidCastException異常。

例如:

1 public static void Main()
2 {
3      Int32 x = 5;
4      Object o = x;   
5      Int64 y = (Int64) (Int32) o;
6 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved