引用型別和值型別

2022-02-19 15:03:23 字數 739 閱讀 3048

clr支援兩種型別:引用型別和值型別。

引用型別總是從託管堆上分配的。

c#中的new操作符返回物件的記憶體位址。

引用物件的注意點:

1、記憶體從託管堆中分配

2、堆上分配物件,有一些額外的操作,影響一些效能的

3、從託管堆中分配乙個物件時,可能強制執行一次垃圾**。

clr中的值型別是輕量級的。不需要提領乙個指標,不需要垃圾**,可以減少垃圾**的次數。

在clr中一般稱為「類」的都是引用型別,所有的值型別都稱為結構或者列舉。

所有的結構都是抽象類valuetype的直接派生類。valuetype是直接從object派生的。

所有的列舉都是從enum抽象類中派生的,enum又是從valuetype派生的。

乙個值型別可以實現乙個或者多個介面,但是不能繼承基類。所有的值型別都是隱式密封的。

c#中用struct宣告結構,class宣告類。

值型別應滿足:

1、型別具有基元型別

2、型別不需要從其他任何型別繼承

3、不會作為基類

4、型別的大小不要超過16k

值型別和引用型別的不同點:

1、不能將值型別作為基型別

2、引用型別變數包含的是堆上的乙個物件位址。值型別是值物件本身。

3、值型別賦值的時候會執行一次逐字段的複製,引用型別變數賦值的時候,只複製記憶體位址。

4、引用型別的多個變數可能引用堆中的同乙個物件,值型別是自成一體的,互不影響的。

引用型別和值型別

c 是一種型別安全的語言。每乙個變數都要求定義為乙個特定的型別,並且要求儲存在變數中的值只能是這種型別的值。變數既能儲存值型別,也可以儲存引用型別,還可以是指標。這一課將講述前兩種型別,關於指標的討論我們將在下一課中進行。下面是關於值型別和引用型別不同點的概論 如果乙個變數v儲存的是值型別,則它直接...

引用型別和值型別

c 中值型別和引用型別作為方法引數傳遞的時候其實都可以說是 值 的傳遞,只不過這裡的 值 指代的東西有所區別。當方法的引數為值型別時,方法傳遞的是值本身的值。當方法的引數為引用型別時,方法傳遞的則是應用型別的引用的位址,也就是引用型別位址在棧上的值。舉個引用型別作為引數傳遞的例子 static vo...

值型別和引用型別

為了更好地說明兩種型別之間的區別,借用如下的 來說明 值型別引用型別 記憶體分配地點 分配在棧中 分配在堆中 效率效率高,不需要位址轉換 效率低,需要進行位址轉換 記憶體 使用完後,立即 使用完後,不是立即 等待gc 賦值操作 進行複製,建立乙個同值新物件 只是對原有物件的引用 函式引數與返回值 是...