值型別與引用型別是很基礎的知識,也有很多對此的介紹,如果想深入了解,張老師的部落格講解的很好,鏈結如下:
我在這裡只是淺淺的介紹一下下:
從概念上看,值型別直接儲存其值,而引用型別儲存對其值的引用。
我們知道,c#中的每一種型別要麼是值型別,要麼是引用型別。所以每個物件要麼是值型別的例項,要麼是引用型別的例項。
值型別和引用型別
的基類
引用型別和值型別都繼承自system.object類。不同的是,幾乎所有的引用型別都直接從system.object繼承,而值型別則繼承其子類,即直接繼承system.valuetype。
作為所有型別的基類,system.object提供了一組方法,這些方法在所有型別中都能找到,其中包含tostring方法及clone等方法。
system.valuetype直接繼承system.object,
即system.valuetype
本身是乙個類型別,而不是值型別;
system.valuetype
沒有新增任何成員,但覆蓋了所繼承的一些方法,使其更適合於值型別。例如,
valuetype
重寫了equals()
方法,從而對值型別按照例項的值來比較,而不是引用位址來比較。
struct programis value type.
", testtype.tostring());
}console.readline();
}}
值型別
值型別的特性:
1.c#的所有值型別均隱式派生自system.valuetype。
各個值型別及其基類:
結構體:struct(直接派生於system.valuetype);
數值型別:
整型:
short(system.int16),
ushort(system.uint16),
int(system.int32),
uint(system.uint32)
,long(system.int64),
ulong(system.uint64),
sbyte(system.sbyte的別名),byte(system.byte),
字元型:char(system.char);
浮點型:float(system.single),double(system.double);
用於財務計算的高精度decimal型:decimal(system.decimal)。
bool型:bool(system.boolean的別名);
列舉:enum(派生於system.enum);
可空型別(派生於system.nullable泛型結構體,語法t?是 system.nullable的簡寫,此處的t為值型別。)
2.每種值型別均有乙個隱式的預設建構函式來初始化該型別的預設值。
例如:int i = new int();
等價於:
int32 i = new int32();
等價於:
int i = 0;
等價於:
int32 i = 0;
使用new
運算子時,將呼叫特定型別的預設建構函式並對變數賦以預設值。在上例中,預設建構函式將值
0賦給了i。
3.所有的值型別都是密封(seal)的,所以無法派生出新的值型別。
4.
引用型別
引用型別的特性:
1.c#的所有引用型別均隱式派生自system.object。
各個引用型別及其基類:
陣列:(派生於
system.array
)陣列的元素,不管是引用型別還是值型別,都儲存在託管堆上
;類:class
(派生於
system.object
);介面:inte***ce
(介面不是乙個「東西」,所以不存在派生於何處的問題。
);委託:delegate
(派生於
system.delegate
);object:(
system.object
的別名);
字串:string
(system.string
的別名)。
2.
引用型別可以派生出新的型別。
3.引用型別可以包含null值。
4.引用型別變數的賦值只複製對物件的引用,而不複製物件本身。
5.引用型別的物件總是在程序堆中分配(動態分配)。
值型別和引用型別的區別
所有繼承system.value的型別都是值型別,其他型別都是引用型別。
引用型別
可以派生出新的型別
,而值型別不能;
引用型別儲存在堆中,而值型別既可以儲存在堆中也可以儲存在棧中。
引用型別可以包含
null
值,值型別不能(可空型別功能允許將
null
賦給值型別);
引用型別變數的賦值只複製對物件的引用,而不複製物件本身。
而將乙個值型別變數賦給另乙個值型別變數時,將複製包含的值。
當比較兩個值型別時,進行的是內容比較;而比較兩個引用型別時,進行的是引用比較。
值型別在記憶體管理方面具有更好的效率,並且不支援多型,適合用作儲存資料的載體;引用型別支援多型,適合用於定義應用程式的行為。
int是引用型別還是值型別
陣列型別是一族型別,它們都繼承system.array,而system.array繼承自system.object。所以所有的陣列型別都是引用型別
C 系列之值型別和引用型別
這幾天一直在思考這章討論什麼,在上一章討論string的時候牽涉到引用型別,那麼我們這一章討論討論一下,值型別和引用型別。值型別和引用型別,它們的區別 於傳值方式。有人會認為值型別就存在棧上這是不一定的。詳細看下文。有些人會說啊。有垃圾 機制進行清理記憶體。不需要去折騰那麼多吧 為了寫好 避免面試問...
C 值型別和引用型別
c 資料型別 值型別,引用型別 概念 值型別直接儲存其值,引用型別儲存對值的引用 這兩種型別儲存在記憶體的不同地方 值型別儲存在堆疊中,引用型別儲存在託管堆上。乙個引用型別的例子,如圖 上圖中,只有乙個user物件,u1和u2都指向包含該物件的記憶體位置 執行結果 在c 中,基本資料型別如bool和...
c 值型別和引用型別
今天我們來學習一下什麼是值型別和引用型別。1.值型別的值存在棧上,引用型別棧上存的是位址,值在堆上 2.將乙個值型別變數賦給另乙個值型別變數時,將複製包含的值。引用型別變數的賦值只複製對物件的引用,而不複製物件本身。3.裝箱是將值型別轉換為引用型別,拆箱是將引用型別轉換為值型別,利用裝箱和拆箱功能,...