c 中的引用型別和值型別

2022-03-16 03:57:46 字數 1304 閱讀 8523

一,c#中的值型別和引用型別

眾所周知在c#中有兩種基本型別,它們分別是值型別和引用型別;而每種型別都可以細分為如下型別:

什麼是值型別和引用型別

什麼是引用型別:

區別和效能

效能:常見誤區

結構是輕量級的類:這種錯誤的資訊主要是因為有人認為值型別不應該有方法或者其它有意義的行為-它們應該作為簡單的資料轉移來使用,所以很多人分不清datetime到底是值型別還是引用型別。

物件在c#中預設的是用過引用傳遞的:其實在呼叫方法的時候,引數值(物件的乙個引用)是以傳值得方式傳遞的,如果你想以引用方式傳遞的話,可以使用ref或者out關鍵字。

二,值型別的裝箱和拆箱操作

1

int i = 5;2

object o =i;

3int j = (int)o;

4 int16 y=(int16)o;

什麼是裝箱,什麼是拆箱

什麼是裝箱:將已裝箱的值型別例項(此時它已經是引用型別了)轉化成值型別的過程(例如上面**的第3行),注意:拆箱不是直接將裝箱過程倒過來,拆箱的代價比裝箱要低的多,拆箱其實就是獲取乙個指標的過程。乙個已裝箱的例項在拆箱時,編譯器在內部都幹了下面這些事:

它們在什麼情況下發生,以及如何避免

1

static

void main(string

args)

2

通過上面的分析我們已經知道了,裝箱和拆箱/複製操作會對應用程式的速度和記憶體消耗產生不利的影響(例如消耗記憶體,增加垃圾**次數,複製操作),所以我們應該注意編譯器在什麼時候會生成**來自動這些操作,並嘗試手寫這些**,盡量避免自動生成**的情況。

它對避免裝箱有什麼作用?

c#中常見的泛型集合:

queue;

stack;

list;

dictionary;

hashset;

在使用這些集合之前我們必須要理解每一種集合的工作原理(沒事自己可以實現一下),了解每一種集合的適合場合,這樣才能寫出高效的**。

四,在設計時如何選擇類和結構體

在面試的時候,我們經常被問的乙個問題(還有另外乙個問題,如何選擇抽象類和介面,下次我會單獨聊聊這個問題),下面我們來聊聊在設計時應該如何選擇結構體和類

什麼情況下選擇結構體,什麼情況下選擇類

都說程式是一門注重實踐的學科,但是也只有熟悉理解了這些概論的東西,才能在實踐時寫出優秀的**,有不對或者不合理的地方歡迎在下面討論;

C 中引用型別和 值型別

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

C 中引用型別和值型別

c 的值型別包括 結構體 數值型別,bool型,使用者定義的結構體 列舉,可空型別。c 的引用型別包括 陣列,使用者定義的類 介面 委託,object,字串。值型別和引用型別的區別在於,值型別的變數直接存放實際的資料,而引用型別的變數存放的則是資料的位址,即物件的引用。值型別變數直接把變數的值儲存在...

C 中引用型別和值型別

c 的值型別包括 結構體 數值型別,bool型,使用者定義的結構體 列舉,可空型別。c 的引用型別包括 陣列,使用者定義的類 介面 委託,object,字串。值型別和引用型別的區別在於,值型別的變數直接存放實際的資料,而引用型別的變數存放的則是資料的位址,即物件的引用。值型別變數直接把變數的值儲存在...