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.裝箱是將值型別轉換為引用型別,拆箱是將引用型別轉換為值型別,利用裝箱和拆箱功能,...