C 引用型別和值型別的對比 裝箱與拆箱

2022-07-21 12:36:18 字數 2086 閱讀 3346

1***、

c#中有兩種型別: 值型別和引用型別: 值型別的變數直接包含他們的資料,而引用型別的變數儲存引用型別儲存對他們的資料的引用,後者稱為物件: 簡單說:值型別直接儲存其值,引用型別儲存對值得引用.引用型別分為引用和引用的物件。

2***、

值型別:簡單型別、列舉、結構

引用型別: 類型別、介面型別、陣列型別和委託型別

3***、值型別與引用型別的記憶體儲存 單純的說值型別儲存在棧上,引用型別儲存在託管堆上是不對的。

4***、區別:

1) 託管堆: 同步塊和方法表, x,y,託管堆上的需要gc來** 執行緒堆疊: 沒有同步塊和方法表

2) 值型別賦值是重新建立乙個副本 而引用型別的賦值是共享同一塊記憶體(副本),是指向同一塊記憶體(引用型別的名字相當於指向操作)。只是複製引用而不複製被引用識別的物件。(「引用」和「引用的物件」)

3) 值型別與引用型別的不同之處就在於值型別的變數直接包括他們的資料,而引用型別的變數把references儲存到他們的資料庫(objects)中。

4) 所有的值型別從object中繼承來的。任何型別都不能由值型別派生而來,因此,值型別是封閉式的。

5***什麼時候使用值型別

1)當型別是乙個十分簡單的型別,其中沒有成員會修改型別的任何例項字段

2)型別不需要從其他任何型別繼承

3)型別不會派生出其他任何型別

4)型別的例項較小

5)型別不作為方法引數傳遞,也不作為方法的返回型別使用

6)引用型別可以包含null值,值型別不能(可空型別功能允許將null賦給值型別);

6***什麼時候用ref和out ref:

值型別在傳遞希望成為引用的時候,ref就是告訴傳遞的時候不是拷貝,而是同乙個副本。 out:不需要給變數賦初值,使用out也沒必要在外面賦初值,是在內部賦「初值」,out傳遞值是理解成沒有初始化的。

7***深度分析值型別和引用型別(記憶體中的部署)

例子:objectreference r = new object();

關鍵字new在託管堆上分配記憶體空間,並返回乙個該記憶體空間的位址。左邊的reference位於棧上,是乙個引用,儲存著乙個記憶體位址;而這個位址指向的記憶體(位於託管堆上)裡儲存著其內容。

規律: 1)引用型別部署在託管堆上 2)值型別總是分配在它宣告的地方:作為欄位時,跟隨其所屬的例項儲存。作為區域性變數時,儲存在棧上。

總結: 引用型別在棧上儲存乙個引用,其實際的儲存位置位於託管堆。

8***裝箱與拆箱操作

1) 裝箱操作 裝箱(box)就是將值型別轉換為引用型別的過程。而相反的過程就叫拆箱(unbox)。 裝箱時發生了什麼?

(1)在堆上分配記憶體。因為值型別最終有乙個物件代表,所有堆上分配的記憶體量必須是值型別的大小加上容納此物件及其內部結構(比如虛擬方法表)所需的記憶體量。

(2)值型別的值被複製到新近分配的記憶體中

(3)新近分配的物件位址被放到堆疊上,現在它指向乙個引用型別。

2)拆箱操作 注:被裝過箱的物件才能被拆箱。 在裝箱的時候,並不需要顯示型別轉換.但在拆箱時需要型別轉換.這是因為在拆箱時物件可以被轉換為任意型別. 注意:裝箱操作可以隱式進行,但拆箱操作必須顯示。 首先,檢查這個物件例項,看它是否為給定值型別的裝箱值。 然後,把這個例項的值拷貝給值型別的變數。 要儘量減少裝箱與拆箱操作

9***問題

1)c#中null和""的區別 string是引用型別: string str= null 沒有建立記憶體空間,str中存放的是空引用指標. string str="" str中存放的是指向堆中的指標。有指向 簡單地說: string str =""; 給你一張白紙; string str = null; 連白紙也沒有。 string.empty就相當於"" 一般用於字串的初始化 判定為空字串的幾種寫法,按照效能從高到低的順序是: s.length == 0 優於 s == string.empty 優於 s == ""

2)c#裡面的垃圾** gc(垃圾**)**的都是可託管**,也就是託管堆中的** 一般定義乙個引用變數,它肯定會在堆上面占用一塊空間,棧上有個位址指向這個儲存位置,只有黨gc發現堆上這個資源在棧上沒有位址指向它的時候才把這塊記憶體**。 非託管資源gc是不會自動**的,例如資料庫鏈結,檔案等。

C 裝箱和拆箱(值型別和引用型別)

在 c 語言中資料型別分為值型別和引用型別,將值型別轉換為引用型別的操作稱為裝箱,相應地將引用型別轉換成值型別稱為拆箱。c tostring 方法用於將任意的資料型別轉換成字串型別,例如將整數型別轉換成字串型別。int a 100 string str a.tostring 裝箱 在上面的轉換中 i...

C 裝箱和拆箱 值型別和引用型別

裝箱 boxing 和拆箱 unboxing 是c 型別系統的核心概念.是不同於c與c 的新概念!通過裝箱和拆箱操作,能夠在值型別和引用型別中架起一做橋梁.換言之,可以輕鬆的實現值型別與引用型別的互相轉換,裝箱和拆箱能夠統一考察系統,任何型別的值最終都可以按照物件進行處理.c 語言中的所有型別都是由...

值型別和引用型別,裝箱和拆箱

c 中任何型別都是隱式繼承自 system.object 引用型別 分為兩大類,值型別和引用型別。值型別包括 簡單型別 int,float,double等 結構體,列舉 引用型別包括 自定義的類,字串,介面,陣列 區別 1.值型別儲存在棧中,自動釋放,比較高效 引用型別儲存在堆中,需要手動釋放 2....