C#值型別和參考型別這個概念在剛學習的時候應該就知道了,但是我們并沒有深入的去理解它,越是基礎知識其實才是最有用的,對代碼的優化,代碼質量的提升都有幫助,通過整理本文章,對很多知識也起到了鞏固的作用吧,
1,值型別
值型別有:整型,浮點型,十進制,布爾型,struct,列舉,值型別是在執行緒堆疊上分配的,值型別也稱輕量級型別,一個值型別的變數就包含了值型別的值,所以它沒有參考型別的指標,所有值型別的資料都無法為null,所以我們宣告時必須賦初始值,
2,參考型別
參考型別有:class(類),interface(介面),delegate(委托),object,string,陣列,???參考型別是在托管堆上分配的,我們常用的new運算子會回傳一個物件的指標,也就是物件資料在記憶體中的地址的一個參考,參考型別的傳遞其實就是傳遞物件的指標,參考型別在創建時默認為null,也就是當前變數不指向一個有效的物件,這時如果我們去讀取null物件里的屬性值時就會出現我們常遇見的例外:“未將物件的參考設定到物件的實體”,是不是很熟悉,所以在實際開發中我們在操作物件的時候一定要先判斷該物件是不是為null,避免例外,
值型別和參考型別我們用的都比較多,那肯定就避免不了裝箱和拆箱操作,
3,什么是裝箱?
裝箱就是值型別轉為參考型別,
4,什么是拆箱?
拆箱就是參考型別轉為值型別,這里要注意兩點:
4.1,只有被裝箱過的物件才能被拆箱,
4.2,一個物件拆箱后只能還原為未裝箱之前的型別,看下面代碼:
1 int i = 5; 2 object obj = i;//裝箱操作 3 Int16 j = (Int16)obj;//拆箱操作
我們先給i做了裝箱操作,然后在拆箱,但是還原的是Int16型別,這里就會拋出例外:“指定的轉換無效”,
5,有的同學說裝箱和拆箱都影響性能,那么到底是裝箱影響呢還是拆箱影響呢還是都影響呢?
5.1,裝箱都發生了什么呢:
1,首先在托管堆中分配好記憶體,分配的記憶體量是值型別欄位需要的記憶體量加上托管堆上需要的物件的兩個額外成員(物件指標,同步塊索引)需要的記憶體,
2,值型別的欄位復制到新分配的記憶體中,
3,回傳物件的地址,也就是物件的參考,
5.2,拆箱都發生了什么呢:
1,獲取已裝箱的值型別實體的指標,
2,把獲取到的值復制到堆疊,
所以裝箱時比較耗費性能的,還有可能引發一次GC操作,而拆箱只是一個獲取指標的程序耗費資源比裝箱要小的多,正因為值型別有裝箱拆箱操作,所以像ArrayList這樣的集合性能時非常令人擔憂的,所以C#2.0出現的泛型:List<>?,減少了裝箱拆箱操作,
6,應用場景
首先不止時面試的時候會經常問到應用場景這個問題,我們平時寫程式的時候也很清楚,大多情況下我們都會使用參考型別,那什么時候會使用值型別呢?
6.1,型別不會有被繼承的可能,也不會繼承其他的型別,
6.2,型別的實體比較小,不會被做為方法的引數,不會被頻繁賦值,
本文就到此結束了,感覺自己也學到了不少東西,以后沒事的時候也可以拿來看看,同時呢也希望可以幫助到需要的人,如有錯誤的地方還望大神指點,繼續加油!
原文來自:C#基礎知識1-深入理解值型別和參考型別-曾亞平個人博客

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/101927.html
標籤:C#
上一篇:C# 使用GDI繪制雷達圖
