值型別與引用型別

介紹

價值型別

值型別是兩者中較簡單的。值型別通常用於表示資料本身。3D 空間中的整數,布林值或點都是良好值型別的示例。

使用 struct 關鍵字宣告值型別(結構)。有關如何宣告新結構的示例,請參閱語法部分。

一般來說,我們有 2 個關鍵字用於宣告值型別:

  • 結構
  • 列舉

參考型別

參考型別稍微複雜一些。參考型別是物件導向程式設計意義上的傳統物件。因此,它們支援繼承(以及它的好處)並且還支援終結器。

在 C#中,我們通常有這樣的引用型別:

  • 代表
  • 介面

使用 class 關鍵字宣告新的引用型別(類)。有關示例,請參閱語法部分以瞭解如何宣告新的引用型別。

主要差異

參考型別和值型別之間的主要區別如下所示。

堆疊上存在值型別,堆上存在引用型別

這是兩者之間經常提到的差異,但實際上,它歸結為當你在 C#中使用值型別時,例如 int,程式將使用該變數直接引用該值。如果你說 int mine = 0,那麼變數 mine 直接指向 0,這是有效的。但是,引用型別實際上(顧名思義)是對底層物件的引用,這類似於其他語言(如 C++)中的指標。

你可能不會立即注意到這種效果,但效果是存在的,是強大的並且是微妙的。有關示例,請參閱其他地方更改引用型別的示例。

這種差異是導致以下其他差異的主要原因,值得了解。

在方法中更改值型別時,值型別不會更改,引用型別會更改

當值型別作為引數傳遞給方法時,如果方法以任何方式更改值,則值不會更改相反,將引用型別傳遞到同一方法並更改它將更改基礎物件,以便使用同一個物件的其他東西將具有新更改的物件而不是其原始值。

有關詳細資訊,請參閱方法中的值型別與引用型別的示例。

如果我想改變它怎麼辦?

只需使用 ref 關鍵字將它們傳遞給你的方法,然後通過引用傳遞此物件。意思是,它是記憶中的同一個物件。因此,你所做的修改將受到尊重。有關示例,請參閱通過引用傳遞的示例。

值型別不能為 null,引用型別可以

就像它說的那樣,你可以為引用型別賦值 null,這意味著你分配的變數沒有分配給它的實際物件。但是,在值型別的情況下,這是不可能的。但是,你可以使用 Nullable 來允許你的值型別可以為空,如果這是一個要求,但是如果這是你正在考慮的事項,請強烈思考一個類可能不是最好的方法,如果它是你自己的型別。