說到引數傳遞,必須得弄清值型別和引用型別:
(為了容易表達,我暫且命名存放在堆中的內容為堆中物件,存放在棧上的內容為棧中物件。)
值型別存放在棧中,直接訪問。如果有:int a=0;int b=a;就產生了兩個棧中物件。
引用型別需要在堆中顯式分配,且不能直接訪問,需要在棧中分配乙個棧中物件(c++叫指標,c#叫引用)指向其堆中物件。
如果:stringbuilder strb = new stringbuilder();
stringbuilder strb2 = strb;
則在堆中只有乙個堆中物件,只是棧中有兩個棧中物件指向堆中物件。
可以看出:每個變數都是乙個棧中物件。不管是值型別還是引用型別,只是值型別的棧中物件就是其內容,而引用型別的棧中物件只是乙個指向堆中物件的位址。
判斷是值型別還是引用型別:
inta1 =10
;stringbuilder strb1
=new
stringbuilder(
"abc");
inta2
=a1;
stringbuilder strb2
=strb1;
bool
bl1
=object
.referenceequals(a1,a2);
//false為值型別(因為值型別要裝箱)
bool
bl2
=object
.referenceequals(strb1,strb2);
//true為引用型別
引數傳遞分值傳遞和引用傳遞兩種。
通常,在沒有顯式指出ref和out時都是值傳遞。
值傳遞:傳的是物件的值拷貝。(即函式內引數物件是呼叫時傳遞的物件的棧中物件的拷貝。)
引用傳遞:傳的是棧中物件的位址。(即函式內引數物件與呼叫時傳遞的物件完全是同一棧中物件。)
現在用例子來說明傳值跟傳位址的不同:
void
button2_click(
object
sender, system.eventargs e)
...
void
test1(stringbuilder strb)
...
void
test2(
refstringbuilder strb)
...
C 值型別,引用型別
2,引用型別 概念 值型別直接儲存其值,而引用型別儲存對其值的引用。引用型別 string,class,陣列 派生於system.array 委託 派生於system.delegate 介面。引用型別當宣告乙個類時,只在棧中分配一小片記憶體用於容納乙個位址,而此時並沒有為其分配堆上的記憶體空間。3,...
值型別 引用型別
在 c 中有兩種型別的資料,一種是值型別資料,一種是引用型別資料。在編碼的時候區分這兩種型別資料,可以避免一些細小的編碼錯誤。首先說說什麼型別是值型別,例如 int float bool之類的基礎型別,以及用struct定義的型別,如 datetime。除此外,如string,陣列,以及用class...
值型別 引用型別
值型別當乙個值型別賦值給另乙個值型別的時候,預設情況下完成的是乙個成員到另乙個成員的複製。引用型別 引用型別分配在託管堆上。其物件一直保留在記憶體中,直到.net垃圾 器將它們銷毀。預設情況下,乙個引用型別的賦值將new出乙個對該堆上同乙個物件的新引用 new關鍵字返回的是乙個指向堆上物件的引用,而...