哪些屬於值型別?
1、結構(struct)屬於值型別,另外int、double、float、char、bool、decimal(錢)、enum型別屬於值型別,我們可以將滑鼠放在int型別上,然後按f12可以跳轉到型別定義,可以看到int、double、float也屬於結構型別。
哪些屬於引用型別?
2、自定義類屬於引用型別,陣列是隱式的引用型別,另外委託、集合、介面、string和object型別也是引用型別。
物件是引用型別。把物件賦給變數時,實際上時把該物件的指標賦給了該變數,這兩個變數包含同乙個物件的指標。
指標是記憶體中的乙個位址,所以實際上是複製了這個位址。
值型別與引用型別的區別:
1、儲存的地方不同。值型別的值儲存在記憶體的棧中,引用型別的值是儲存在記憶體的堆中。
2、傳遞值型別和傳遞引用型別時,傳遞方式不同。
舉例:
using system;
struct stru
class program
");console.writeline($"類:p2中的結果");
//結構型別是值型別
stru a1 = new stru();
a1.j = 30;
stru a2 = a1;
a2.j = 40;
console.writeline($"結構:a1中的結果");
console.writeline($"結構:a2中的結果");
//陣列是引用型別
int sz1 = new int[1];
sz1[0] = 3;
int sz2 = sz1;//將sz1引用的位址賦值給sz2.
sz2[0] = 4;
console.writeline($"陣列:sz1的結果");
console.writeline($"陣列:sz2的結果");
//int型別是值型別
int number = new int();
number = 1;
int num = number;
num = 2;
console.writeline($"int型別:number結果");
console.writeline($"int型別:num結果");
console.readkey();}}
}/****************************輸出***********************/
類:p1中的結果20
類:p2中的結果20
結構:a1中的結果30
結構:a2中的結果40
陣列:sz1的結果4
陣列:sz2的結果4
int型別:number結果1
int型別:num結果2
//即時輸出視窗
&p10x0093ed98
*&p1: 0x00000000
&p10x0093ed98
*&p1: 0x02ae6350
p1 i: 0
p1 i: 10
&p20x0093ed94
*&p2: 0x02ae6350
p2 i: 10
p2 i: 20
p1 i: 20
&a10x0093ed90
a1 j: 0
&a10x0093ed90
a1 j: 0
a1 j: 30
&a20x0093ed8c
a2 j: 30
a2 j: 40
a1 j: 30
引用型別和值型別
c 是一種型別安全的語言。每乙個變數都要求定義為乙個特定的型別,並且要求儲存在變數中的值只能是這種型別的值。變數既能儲存值型別,也可以儲存引用型別,還可以是指標。這一課將講述前兩種型別,關於指標的討論我們將在下一課中進行。下面是關於值型別和引用型別不同點的概論 如果乙個變數v儲存的是值型別,則它直接...
引用型別和值型別
c 中值型別和引用型別作為方法引數傳遞的時候其實都可以說是 值 的傳遞,只不過這裡的 值 指代的東西有所區別。當方法的引數為值型別時,方法傳遞的是值本身的值。當方法的引數為引用型別時,方法傳遞的則是應用型別的引用的位址,也就是引用型別位址在棧上的值。舉個引用型別作為引數傳遞的例子 static vo...
值型別和引用型別
為了更好地說明兩種型別之間的區別,借用如下的 來說明 值型別引用型別 記憶體分配地點 分配在棧中 分配在堆中 效率效率高,不需要位址轉換 效率低,需要進行位址轉換 記憶體 使用完後,立即 使用完後,不是立即 等待gc 賦值操作 進行複製,建立乙個同值新物件 只是對原有物件的引用 函式引數與返回值 是...