c 中值型別和引用型別

2021-09-05 19:23:00 字數 1763 閱讀 4073

在c#中有兩種型別的資料,一種是值型別資料,一種是引用型別資料。在編碼的時候區分這兩種型別資料,可以避免一些細小的編碼錯誤。

首先說說什麼型別是值型別,例如:int、float、bool之類的基礎型別,以及用struct定義的型別,如:datetime。除此外,如string,陣列,以及用class定義的型別等都是引用型別。對於c#來說,很難羅列出所有型別進行一一分別,這需要自己在編碼過程中進行分析總結。

為了更好地說明兩種型別之間的區別,借用如下的**來說明。

值型別引用型別

記憶體分配地點

分配在棧中

分配在堆中

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

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

記憶體**

使用完後,立即**

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

賦值操作

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

只是對原有物件的引用

函式引數與返回值

是物件的複製

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

型別擴充套件

不易擴充套件

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

通過如上細緻對比,大家對於值型別和引用型別有個清楚的概念。

不過,無論是對於值型別還是引用型別來說,對於其作為函式引數或者返回值的時候,都是容易犯錯誤的地方。

對於值型別來說,當其作為函式引數的時候,希望在函式中被修改,那麼直接如下操作是不能被修改的。

public void increment( int i )

要想在函式中對傳進去的引數做真正的修改,需要借助於ref這個關鍵字,那麼正確的形式如下。

public void increment( ref int i )

也就是說,如果需要在函式中對值型別引數進行修改,需要用ref或者out進行標識才能真正實現。

而對於引用型別來說,當其作為函式引數的時候,它所遇到的情況恰恰與值型別相反,即不希望在函式中被修改,舉例如下。

public void addvalue( mytype typvalue )

由於對於引用型別物件來說,其的賦值操作只是對原有物件的引用,因此在函式對其修改,實際上是直接修改了原有物件資料,這是很多情況不希望發生的(這裡例如對陣列或者datatable操作這類)。

為了防止這種事發生,需要給此型別提供clone函式。例如對於如上的型別,可以入下實現。

public class mytype:icloneable

get}

public mytype()

{}public mytype( int value)

#region icloneable members

public object clone()

#endregion}

那麼在呼叫的時候,用當前的物件的clone作為引數即可。

不過對於引用型別來說,提供乙個clone函式不是一件容易的事情,尤其出現引用型別巢狀的時候,所以說去實現乙個完全clone功能是件很費事又不討好的活,這也就是在論壇中常說的深copy和淺copy的問題。話雖如此,如果對於前面所說的有個大概了解,相信實現也不是不可能。

在c#中,尤其自己定義型別的時候,常常由於是用struct來定義還是用class來定義,即是定義乙個值型別還是乙個引用型別呢。在這兒給了幾個判定條件,如果如下幾點都滿足的話,建議用struct來定義為值型別,否則用class定義為引用型別。

1. 這個型別是否主要為了資料儲存;

2. 是否只通過屬性來訪問物件的資料成員;

3. 這個型別是否不會有子型別;

4. 在程式處理的時候不會把這個型別物件通過多型來處理。

C 中值型別和引用型別

概念 1.值型別 資料儲存在記憶體的堆疊中,從堆疊中可以快速地訪問這些資料,因此,值型別表示實際的資料。2.引用型別 表示指向儲存在記憶體堆中的資料的指標或引用 包括類 介面 陣列和字串 c 中定義的值型別包括原型別 sbyte byte short ushort int uint long ulo...

C 中值型別和引用型別

本文將介紹c 型別系統中的值型別和引用型別,以及兩者之間的一些區別。同時,還會介紹一下裝箱和拆箱操作。首先,我們看看在c 中哪些型別是值型別,哪些型別是引用型別。值型別 結構型別 struct 列舉型別 enum 引用型別 變數的初始化中,都會有乙個預設值,在c 中,我們可以通過default關鍵字...

c 中值型別與引用型別

c 的值型別包括 結構體 數值型別,bool型,使用者定義的結構體 列舉,可空型別。c 的引用型別包括 陣列,使用者定義的類 介面 委託,object,字串。陣列的元素,不管是引用型別還是值型別,都儲存在託管堆上。引用型別在棧中儲存乙個引用,其實際的儲存位置位於託管堆。為了方便,這裡將引用型別部署在...