C 學習 關於值型別和引用型別

2021-07-02 21:36:03 字數 655 閱讀 5361

值型別:c#的基本型別(int、long、float、char、bool)、結構(struct)、列舉(enum),均繼承自system.valuetype,空間在棧內分配;

引用型別:類(class自定義類、基類system.object)、string、委託(delegate關鍵字宣告的類)、介面(inte***ce)、陣列(派生於system.array),在棧中儲存乙個引用,其實際的儲存位置位於託管堆;

兩者相同之處:結構體可以實現介面

兩者不同之處:(1)引用型別可以派生出新的型別,值型別不可以;(2)引用型別可以包含null值,值型別不可以(可空型別允許將null賦給值型別);(3)引用型別變數賦值只複製物件的引用,而不複製物件本身,值型別變數賦值給另乙個值型別變數,將複製包含的值;

值型別和引用型別的使用場合:

值型別(不支援多型)適合儲存c#應用程式操作的資料,而引用型別(支援多型)應用於定義應用程式的行為,通常使用引用型別多於值型別;

通常我們建立的引用型別總是多於值型別。如果以下問題的回答都為yes,那麼我們就應該建立為值型別:

該型別的主要職責是否用於資料儲存?

該型別的共有藉口是否完全由一些資料成員訪問屬性定義?

是否確信該型別永遠不可能有子類?

是否確信該型別永遠不可能具有多型行為? 

參考:

C 學習筆記 值型別和引用型別

1 值型別直接儲存其值,而引用型別儲存對值的引用。2 值型別儲存在堆疊中,而引用型別儲存在託管堆上。3 在c 中,基本資料型別都是值型別 而大多數複雜的c 資料型別,包括我們自己宣告的類都是引用型別,它們分配在堆中,其生存期可以跨多個函式呼叫,可以通過乙個或幾個別名來訪問。如果想把自己定義的型別定義...

關於C 值型別,引用型別,值傳遞,引用傳遞

說到引數傳遞,必須得弄清值型別和引用型別 為了容易表達,我暫且命名存放在堆中的內容為堆中物件,存放在棧上的內容為棧中物件。值型別存放在棧中,直接訪問。如果有 int a 0 int b a 就產生了兩個棧中物件。引用型別需要在堆中顯式分配,且不能直接訪問,需要在棧中分配乙個棧中物件 c 叫指標,c ...

C 值型別和引用型別

c 資料型別 值型別,引用型別 概念 值型別直接儲存其值,引用型別儲存對值的引用 這兩種型別儲存在記憶體的不同地方 值型別儲存在堆疊中,引用型別儲存在託管堆上。乙個引用型別的例子,如圖 上圖中,只有乙個user物件,u1和u2都指向包含該物件的記憶體位置 執行結果 在c 中,基本資料型別如bool和...