值型別
引用型別
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 陣列 自定義的類,內建的類,物件.兩者在記憶體中的儲存方式 值型別 只需要一段單獨的記憶體,用於儲存實際的資料,單獨定義的時候放在棧中 引用型別 需要兩段記憶體 第一段儲存實際的資料,它總是...