c 基礎 值型別和引用型別

2021-04-21 13:55:33 字數 1110 閱讀 6300

c#中有兩種型別的資料,一種是值型別資料,一種是引用型別資料。

首先說說什麼型別是值型別,例如:int、float、bool之類的基礎型別,以及用struct定義的型別,如:datetime。除此外,如string,陣列,以及用class定義的型別等都是引用型別。具體對比如下:

值型別引用型別

記憶體分配地點

分配在棧中

分配在堆中

效率效率高,不需要位址轉換

效率低,需要進行位址轉換

記憶體**

使用完後,立即**

使用完後,不是立即**,等待gc**

賦值操作

進行複製,建立乙個同值新物件

只是對原有物件的引用

函式引數與返回值

是物件的複製

是原有物件的引用,並不產生新的物件

型別擴充套件

不易擴充套件

容易擴充套件,方便與型別擴充套件

**示例:

using  system;

// 定義乙個類,

屬於值型別

class  refrectangle

// 定義乙個結構,

類屬於引用型別

struct  valrectangle

class  refvalrectangle

} 這樣產生結果為:

dimensions of ref1 are : 3...4

change dimensions of ref1

dimensions of ref1 now are :  10.....50

true

dimensions of ref1 are : 3...4

change dimensions of ref1

dimensions of ref1 now are :  3.....4

false

可以看出,當值型別的變數傳遞後,改變第乙個變數,不會影響第二個變數的值,這是因為,當變數傳遞時,是在堆疊中又分配了乙個位址給新的變數,所以這個兩個變數在傳遞發生後,不再有關係。

而引用型別的變數傳遞後,改變第乙個,第二個變數隨之改變,是因為兩個變數同時引用堆中的乙個位址的內容,當乙個變數改變,對應與記憶體中的堆也隨之改變,而另外的乙個變數也隨之改變。

C 基礎 值型別和引用型別

struct型別 由一系列具有相同型別或不同型別的資料構成的資料集合 static void main string args struct person enmu型別 使用關鍵字const建立常量,建立常量時必須設定其初始值,一旦設定不允許修改。char只定義乙個unicode字元 string類...

C 值型別和引用型別

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

c 值型別和引用型別

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