c# 支援兩種型別:「值型別」和「引用型別」。 值型別(value type)(如 char、int 和 float)、列舉型別和結構型別。
引用型別(reference type) 包括類 (class) 型別、介面型別、委託型別和陣列型別。
如何來劃分它們? 以它們在計算機記憶體中如何分配來劃分
值型別與引用型別的區別?
1,值型別的變數直接包含其資料,
2,引用型別的變數則儲存物件引用。
3.對於引用型別,兩個變數可能引用同乙個物件,因此對乙個變數的操作可能影響另乙個變數所引用的物件。
4.對於值型別,每個變數都有自己的資料副本,對乙個變數的操作不可能影響另乙個變數。
值型別隱式繼承自system.valuetype 所以不能顯示讓乙個結構繼承乙個類,c#不支援多繼承
堆疊(stack)是一種先進先出的資料結構,在記憶體中,變數會被分配在堆疊上來進行操作。
堆(heap)是用於為型別例項(物件)分配空間的記憶體區域,在堆上建立乙個物件, 會將物件的位址傳給堆疊上的變數(反過來叫變數指向此物件,或者變數引用此物件)。
關於物件轉殖的所設計到知識點
淺拷貝:是指將物件中的所有字段逐字複雜到乙個新物件
對值型別字段只是簡單的拷貝乙個副本到目標物件,改變目標物件中值型別欄位的值不會反映到原始物件中,因為拷貝的是副本
對引用型字段則是指拷貝他的乙個引用到目標物件。改變目標物件中引用型別欄位的值它將反映到原始物件中,因為拷貝的是指向堆是上的乙個位址
深拷貝:深拷貝與淺拷貝不同的是對於引用欄位的處理,深拷貝將會在新物件中建立乙個新的物件和原始物件中對應字段相同(內容相同)的字段,
也就是說這個引用和原始物件的引用是不同, 我們改變新物件中這個欄位的時候是不會影響到原始物件中對應欄位的內容。
淺複製: 實現淺複製需要使用object類的memberwiseclone方法用於建立乙個淺表副本
深複製: 須實現 icloneable介面中的clone方法,且需要需要轉殖的物件加上[serializable]特性
icloneable介面
支援轉殖,即用與現有例項相同的值建立類的新例項。
memberwiseclone 方法建立乙個淺表副本,方法是建立乙個新物件,然後將當前物件的非靜態字段複製到該新物件。如果欄位是值型別的,則對該字段執行逐位複製。
如果欄位是引用型別,則複製引用但不複製引用的物件;因此,原始物件及其複本引用同一物件。
class drawbase:system.object , icloneablepublic object clone()
}class program
}
執行結果: return this as object; //引用同乙個物件
輸出:jmj a9fs3 lj
true return this.memberwiseclone(); //淺複製
return new drawbase() as object;//深複製 輸出均為: jmj jmj jmj false
解釋: return this as object 方法總是引用同乙個物件,因此相應的堆記憶體上的值會改變! 後兩種方法都是對物件的複製,區別在於複製的類別不同:
深複製會複製整個填充的物件,包括該物件中其他引用型別和值型別的值;
而淺複製只複製了乙個物件中所有引用,它沒有值的複製,通過引用它們的其他物件的引用來共享它們。
淺複製和深複製
在c 中,下面三種物件需要呼叫拷貝建構函式 有時也稱 複製建構函式 1 乙個物件作為函式引數,以值傳遞的方式傳入函式體 全域性函式,傳入的是物件 void g fun resume c 2 乙個物件作為函式返回值,以值傳遞的方式從函式返回 全域性函式 返回的是物件 resume g fun 3 乙個...
深複製和淺複製
以下 是否完全正確,執行可能得到的結果是 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class a class b b void sayhello b b int main 程式正常執行 程式編譯錯誤 程式崩潰 程式死迴圈 這個程式會直接崩潰 voidsayhello ...
深複製和淺複製
main.m 深複製和淺複製。created by yaomars on 16 4 27.import 建立乙個nsdictionary,並建立可變副本和不可變副本,說下是深複製還是淺複製。int main int argc,const char argv 第三種方式 建立乙個nsdictionar...