竟然一不小心犯了低階錯誤,資料型別的值型別和引用型別弄混了。
想用list記錄下所有的二維陣列值,結果發現list裡所有的值都是一樣的。
c#資料型別分為兩大類:值型別和引用型別。
值型別資料主要有:結構體struct,列舉體enum,布林型bool,浮點型,整型。
引用型別資料主要有:陣列,字串,介面,委託,類。
值型別和引用型別的區別:
引用型別繼承自system.object,值型別繼承自system.valuetype。
引用型別儲存到記憶體的堆heap中,值型別儲存在記憶體的堆疊stack中。在.net中,棧的記憶體是自動釋放的,而堆會有垃圾**器gc來釋放。
引用型別可以派生出新的型別,而值型別不可以。引用型別可以包含null值,而值型別不可以。
引用型別變數賦值只複製物件的引用,不複製物件本身。而將乙個值型別變數賦給另乙個值型別變數時,將複製包含的值。
想用list記錄下所有的二維陣列值,結果發現list裡所有的值都是一樣的。
1.錯誤的使用。只new一次,所有的變數valuelst1 實際上是乙個值,同乙個位址。
privatevoid
test()
}
valuelst1裡所有值都是[9,10]。
2正確。每次重新new
privatevoid
test2()
}
valuelst1的值分別是[0,0],[1,2].......
關於C 值型別,引用型別,值傳遞,引用傳遞
說到引數傳遞,必須得弄清值型別和引用型別 為了容易表達,我暫且命名存放在堆中的內容為堆中物件,存放在棧上的內容為棧中物件。值型別存放在棧中,直接訪問。如果有 int a 0 int b a 就產生了兩個棧中物件。引用型別需要在堆中顯式分配,且不能直接訪問,需要在棧中分配乙個棧中物件 c 叫指標,c ...
C 值傳遞和引用傳遞
概念 在定義函式時函式括號中的變數名成為形式引數,簡稱形參或虛擬引數 在主調函式中呼叫乙個函式時,該函式括號中的引數名稱為實際引數,簡稱實參,實參可以是常量 變數或表示式。注意 c語言中實參和形參之間的資料傳遞是單向的值傳遞。被呼叫函式的形參只有函式被呼叫時才會臨時分配儲存單元,一旦呼叫結束占用的記...
C 值傳遞 指標傳遞和引用傳遞(C )
一 基本介紹 1 值傳遞 形參是實參的副本 複製 拷貝 形參值的改變不會影響實參的值,這種方式用的最多。2 指標傳遞 形參是指標型別,形參作指標運算後指向的就是實參,所以會影響實參的值,這種方式用的也很多。引數。這種方式用的也蠻多的。引用只是乙個別名 二 示例 1 值傳遞 1 include voi...