C 中對值型別和引用型別的一點認識

2022-03-25 05:15:16 字數 1861 閱讀 5319

區別值型別和引用型別的重要一點就是值型別賦值的時候是給出一塊記憶體空間,空間裡放下要賦給值型別的值。而引用型別是開闢一塊記憶體空間,空間裡放下的是要賦給引用型別值的指向位址。

就像乙個是複製了銀行卡裡的現金,你花了你複製的現金,和該銀行卡是沒有關係的。而引用型別是複製了乙個銀行卡,此卡為銀行卡的副卡,因為他們的指向位址是一樣的,所以當你使用副卡

的時候,主卡里的錢也會隨之變動。

下面給出一段**。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

}public

class

person

public

int age

}public

static

class

referenceandvalue

;int age = tang.age;//

age=tang.age=25

tang.age = 22

; person name = tang;//

name.name=andelshejlsberge

tang.name = "

tangxuelong

";//

tang.name=tangxuelong name.name=tang.name=tangxuelong

console.writeline(

"tang.name=

",tang.name);

console.writeline(

"tang.age=

", tang.age);

console.writeline(

"age=

", age);

console.writeline(

"name=

", name.name);

console.readline();}}

}

分析一下**。首先建立了乙個person類,該類中包含name和age倆個屬性

我們在方法中建立person的物件tang,初始化物件的name和age。

這時候看下一步,我們將物件tang的age賦值給乙個int型別的變數age,然後改變物件tang的age的值,執行結果會告訴我們,此時age=25,tang.age=22;

接下來我們繼續看下面的**,繼續建立乙個物件將tang賦值給該物件。那麼此時如果加入斷點的話我們都知道name.name=tang.name=andershejlsberge這是沒錯的。那麼接下來像上面一樣我們改變tang.name的值我們會發現,name.name的值此時也改變了。

就像開始說的那樣,引用型別不僅僅分配了記憶體空間,還解析了記憶體塊的指向位址。

裝箱和拆箱

裝箱和拆箱其實就是引用型別和值型別之間的轉換

值型別轉換為引用型別就是裝箱,引用型別轉換為值型別就是拆箱。

public

static

class

boxingandunboxing

}

分析一下上面的**。這段**會丟擲system.nullreferenceexceptio

n異常,因為age為引用型別,引用型別是可以賦空值的,然後將引用型別轉換為值型別時,引用型別沒有值。。

所以就丟擲了異常。而去掉這段**輸出結果為0,這是因為我們沒有初始化,預設的值型別變數的值就為0

關於引用型別和值型別一點體會

有list資料結構如下 name numbera2 a3b7 現在需要把name相同的項合併,number累加,就是下表 name numbera5 b7雖然邏輯可以控制list無重複項,為了保險,我選擇用dictionary作為中間物件來實現功能,如下 1 public listmergedata...

C 每天進步一點 引用型別和值型別

在剛參加工作面試時,我們經常會遇到有關值型別和引用型別的問題,你回答的怎麼樣直接影響你在別人心目中的印象,你回答的不好說明你對c 沒有深入的了解學習,今天我帶大家回顧下c 中的引用型別和值型別。clr支援兩種型別 引用型別和值型別。雖然fcl中大多數型別都是引用型別但程式中用的最多的還是值型別。引用...

C 中引用型別和 值型別

值型別 儲存在棧 stack 中,乙個值型別的變數其實是乙個記憶體位址,位址中儲存的就是值本身 包括c 的基本型別 用關鍵字int char float等來宣告 結構 用struct關鍵字宣告的型別 列舉 用enum關鍵字宣告的型別。引用型別 儲存在堆 heap 中,乙個引用型別的變數的值是乙個指標...