C 值型別和引用型別詳解

2022-08-05 06:09:18 字數 1979 閱讀 9294

值型別

引用型別

c#的值型別包括:結構體(數值型別,bool型,使用者定義的結構體),列舉,可空型別。

c#的引用型別包括:陣列,使用者定義的類、介面、委託,object,字串。

陣列的元素,不管是引用型別還是值型別,都儲存在託管堆上。

引用型別在棧中儲存乙個引用,其實際的儲存位置位於託管堆。為了方便,本文簡稱引用型別部署在託管推上。

值型別總是分配在它宣告的地方:作為欄位時,跟隨其所屬的變數(例項)儲存;作為區域性變數時,儲存在棧上。

值型別在記憶體管理方面具有更好的效率,並且不支援多型,適合用作儲存資料的載體;引用型別支援多型,適合用於定義應用程式的行為。

值型別:

單元直接存放「有效值」

如:int a=3;

則a記憶體單元就放的是3

引用型別:

單元放的是另外乙個物件的引用(位址)

如:form form1=new form();

就是說,在記憶體中開闢了乙個物件new form(),form1記憶體單元存放的是那個物件的位址,並非物件本身

3 引用型別和值型別例項

static void showdouble(int val)

", val);

}int mynumber = 5;

console.writeline("mynumber = ",mynumber);

showdouble(mynumber);

console.writeline("mynumber = ",mynumber);

輸出的結果為:

mynumber = 5

mynumber = 10

mynumber = 5

把mynumber作為乙個引數,呼叫showdouble()並不影響main()中mynumber返回值的函式。

但是如果我們把上面的**修改成如下:

static void showdouble(ref int val)

", val);

}int mynumber = 5;

console.writeline("mynumber = ",mynumber);

showdouble(ref mynumber);

console.writeline("mynumber = ",mynumber);

輸出結果為:

mynumber = 5

mynumber = 10

mynumber = 10

這次mynumber中的值被showdouble()修改了。

同樣的除了ref關鍵字以外還有乙個out關鍵字,在作為引數使用的時候,out引數必須看做是還未賦值,例項:

static int maxvalue(int intarray,out int maxindex)

}return maxvalue;

}int myarray = ;

int maxindex;

console.writeline("the maximum value in myarray is ",maxvalue(myarray,out maxindex));

console.writeline("the first occurrence of this value is at element ",maxindex + 1);

輸出結果:

the maximum value in myarray is 8

the first occurrence of this value is at element 8

C 值型別和引用型別

c 資料型別 值型別,引用型別 概念 值型別直接儲存其值,引用型別儲存對值的引用 這兩種型別儲存在記憶體的不同地方 值型別儲存在堆疊中,引用型別儲存在託管堆上。乙個引用型別的例子,如圖 上圖中,只有乙個user物件,u1和u2都指向包含該物件的記憶體位置 執行結果 在c 中,基本資料型別如bool和...

c 值型別和引用型別

今天我們來學習一下什麼是值型別和引用型別。1.值型別的值存在棧上,引用型別棧上存的是位址,值在堆上 2.將乙個值型別變數賦給另乙個值型別變數時,將複製包含的值。引用型別變數的賦值只複製對物件的引用,而不複製物件本身。3.裝箱是將值型別轉換為引用型別,拆箱是將引用型別轉換為值型別,利用裝箱和拆箱功能,...

C 值型別和引用型別

型別被分為兩種 值型別 整數,bool,struct 建構函式 char 字元 小數 引用型別 string 陣列 自定義的類,內建的類,物件.兩者在記憶體中的儲存方式 值型別 只需要一段單獨的記憶體,用於儲存實際的資料,單獨定義的時候放在棧中 引用型別 需要兩段記憶體 第一段儲存實際的資料,它總是...