關於C 值型別,引用型別,值傳遞,引用傳遞

2021-09-05 15:24:02 字數 1198 閱讀 9058

說到引數傳遞,必須得弄清值型別和引用型別:

(為了容易表達,我暫且命名存放在堆中的內容為堆中物件,存放在棧上的內容為棧中物件。)

值型別存放在棧中,直接訪問。如果有: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關鍵字返回的是乙個指向堆上物件的引用,而...