值型別和引用型別

2021-10-13 13:17:35 字數 1855 閱讀 3588

哪些屬於值型別?

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 賦值操作 進行複製,建立乙個同值新物件 只是對原有物件的引用 函式引數與返回值 是...