C 之值型別和引用型別

2021-09-08 02:07:41 字數 3324 閱讀 3649

值型別與引用型別是很基礎的知識,也有很多對此的介紹,如果想深入了解,張老師的部落格講解的很好,鏈結如下:

我在這裡只是淺淺的介紹一下下:

從概念上看,值型別直接儲存其值,而引用型別儲存對其值的引用。

我們知道,c#中的每一種型別要麼是值型別,要麼是引用型別。所以每個物件要麼是值型別的例項,要麼是引用型別的例項。

值型別和引用型別

的基類

引用型別和值型別都繼承自system.object類。不同的是,幾乎所有的引用型別都直接從system.object繼承,而值型別則繼承其子類,即直接繼承system.valuetype。

作為所有型別的基類,system.object提供了一組方法,這些方法在所有型別中都能找到,其中包含tostring方法及clone等方法。

system.valuetype直接繼承system.object,

即system.valuetype

本身是乙個類型別,而不是值型別;

system.valuetype

沒有新增任何成員,但覆蓋了所繼承的一些方法,使其更適合於值型別。例如,

valuetype

重寫了equals()

方法,從而對值型別按照例項的值來比較,而不是引用位址來比較。

struct program

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