c# 支援兩種型別:「值型別」和「引用型別」。
值型別(value type)(如 char、int 和 float)、列舉型別和結構型別。
引用型別(reference type) 包括類 (class) 型別、介面型別、委託型別和陣列型別。
如何來劃分它們?
以它們在計算機記憶體中如何分配來劃分
值型別與引用型別的區別?
1,值型別的變數直接包含其資料,
2,引用型別的變數則儲存物件引用。
對於引用型別,兩個變數可能引用同乙個物件,因此對乙個變數的操作可能影響另乙個變數所引用的物件。對於值型別,每個變數都有自己的資料副本,對乙個變數的操作不可能影響另乙個變數。
值型別隱式繼承自system.valuetype 所以不能顯示讓乙個結構繼承乙個類,c#不支援多繼承
堆疊(stack)是一種先進先出的資料結構,在記憶體中,變數會被分配在堆疊上來進行操作。
堆(heap)是用於為型別例項(物件)分配空間的記憶體區域,在堆上建立乙個物件,
會將物件的位址傳給堆疊上的變數(反過來叫變數指向此物件,或者變數引用此物件)。
關於物件轉殖的所設計到知識點
淺拷貝:是指將物件中的所有字段逐字複雜到乙個新物件
對值型別字段只是簡單的拷貝乙個副本到目標物件,改變目標物件中值型別欄位的值不會反映到原始物件中,因為拷貝的是副本
對引用型字段則是指拷貝他的乙個引用到目標物件。改變目標物件中引用型別欄位的值它將反映到原始物件中,因為拷貝的是指向堆是上的乙個位址
深拷貝:深拷貝與淺拷貝不同的是對於引用欄位的處理,深拷貝將會在新物件中建立乙個新的物件和
原始物件中對應字段相同(內容相同)的字段,也就是說這個引用和原始物件的引用是不同, 我們改變新
物件中這個欄位的時候是不會影響到原始物件中對應欄位的內容。
淺複製: 實現淺複製需要使用object類的memberwiseclone方法用於建立乙個淺表副本
深複製: 須實現 icloneable介面中的clone方法,且需要需要轉殖的物件加上[serializable]特性
[csharp]view plain
copy
namespace
deepcopy
public
object
clone()
} class
program
} }
當return this as object;
輸出:old,new,1
說明:方法總是引用同乙個物件,因此相應的堆記憶體上的值會改變
當return this.memberwiseclone();
輸出:old,old,1
說明:對於內部的class的物件和陣列,會copy位址乙份。[從而改變b時,a也被改變了]
而對於其它內建的int/string/enum/struct/object型別,則進行值copy。
當return new drawbase() as object;
輸出:old,old,0
說明:完全是建立乙個新物件
總結:淺拷貝:是指將物件中的所有字段逐字複雜到乙個新物件。
對值型別字段
只是簡單的拷貝乙個副本到目標物件,改變目標物件中值型別欄位的值不會反映到原始物件中,因為拷貝的是副本;
對引用型字段
則是指拷貝他的乙個引用到目標物件。改變目標物件中引用型別欄位的值它將反映到原始物件中,因為拷貝的是指向堆是上的乙個位址;
深拷貝:
深拷貝與淺拷貝不同的是對於引用欄位的處理,深拷貝將會在新物件中建立乙個新的物件和原始物件中對應字段相同(內容相同)的字段,也就是說這個引用和原始物件的引用是不同, 我們改變新物件中這個欄位的時候是不會影響到原始物件中對應欄位的內容。
C 中深複製和淺複製
c 支援兩種型別 值型別 和 引用型別 值型別 value type 如 char int 和 float 列舉型別和結構型別。引用型別 reference type 包括類 class 型別 介面型別 委託型別和陣列型別。如何來劃分它們?以它們在計算機記憶體中如何分配來劃分 值型別與引用型別的區別...
C 中的深複製和淺複製
c 支援兩種型別 值型別 和 引用型別 值型別 value type 如 char int 和 float 列舉型別和結構型別。引用型別 reference type 包括類 class 型別 介面型別 委託型別和陣列型別。如何來劃分它們?以它們在計算機記憶體中如何分配來劃分 值型別與引用型別的區別...
C 中List的淺複製和深複製
今天在遊戲中碰到乙個排序問題,就是有乙個裝備列表,是和伺服器完全一致的,各種協議需要用到裝備在這個列表中的序號。但是介面顯示的時候需要按照各種方式來排序,但是不能在原來的列表上排序。因此需要複製出乙個列表來,但是如何去複製這個列表,既能實現排序之後不會影響源列表,又要在排序之後,可以從原列表中找到裝...