一,c#中的值類型和引用類型面試
衆所周知在c#中有兩種基本類型,它們分別是值類型和引用類型;而每種類型均可以細分爲以下類型:編程
1 class SomRef 2 { 3 public int x; 4 } 5 struct SomeVal { 6 public int x; 7 } 8 class Program { 9 static void ValueTypeDemo() { 10 SomRef r1 = new SomRef();//在堆上分配 11 SomeVal v1 = new SomeVal();//在棧上分配 12 r1.x = 5;//提領指針 13 v1.x = 5;//在棧上修改 14 SomRef r2 = r1;//只複製引用(指針) 15 SomeVal v2 = v1;//在棧上分配並複製成員 16 } 17 }
二,值類型的裝箱和拆箱操做c#
1 int i = 5; 2 object o = i; 3 int j = (int)o;
4 Int16 y=(Int16)o;
1 static void Main(string[] args) 2 { 3 int v = 5; 4 object o = v; 5 v = 123; 6 Console.WriteLine(v+","+(int)o); 7 }
經過上面的分析咱們已經知道了,裝箱和拆箱/複製操做會對應用程序的速度和內存消耗產生不利的影響(例如消耗內存,增長垃圾回收次數,複製操做),因此咱們應該注意編譯器在何時會生成代碼來自動這些操做,並嘗試手寫這些代碼,儘可能避免自動生成代碼的狀況。編程語言
你能一眼從上面的代碼中看出進行了幾回裝箱操做嗎?正取答案是3次。分別進行了哪三次呢,咱們來看一下:第一次object o=v;第二次在執行 Console.WriteLine(v+","+(int)o);時將v進行裝箱,而後對o進行拆箱後又裝箱。也就是說裝箱過程老是在咱們不經意的時候進行的,因此只有咱們充分了解了裝箱的內部機制,纔能有效的避免裝箱操做,從而提升應用程序的性能。因此對上面的代碼進行以下修改能夠減小裝箱次數,從而提升性能:性能
1 static void Main(string[] args) 2 { 3 int v = 5; 4 object o = v; 5 v = 123; 6 Console.WriteLine(v.ToString() + "," + ((int)o).ToString());//((int)o).ToString()代碼自己沒有任何意義,只爲演示裝箱和拆箱操做 7 }
三,泛型的出現(本節只簡單介紹泛型對裝箱和拆箱所起的做用,關於泛型的具體細節請參考下一篇文章)spa
1 static void Main(string[] args) 2 { 3 ArrayList dateList = new ArrayList { 4 DateTime.Now 5 }; 6 7 IList<DateTime> dateT = new List<DateTime> { 8 DateTime.Now 9 }; 10 }
使用ArrayList時,每添加一個時間都會進行一次裝箱操做,而使用List<DateTime>時就不會進行裝箱操做,從而提升應用程序的性能。線程
Queue<T>;設計
Stack<T>;3d
List<T>;指針
Dictionary<Tkey,Tvalue>;
HashSet<T>;
在使用這些集合以前咱們必需要理解每一種集合的工做原理(沒事本身能夠實現一下),瞭解每一種集合的適合場合,這樣才能寫出高效的代碼。
四,在設計時如何選擇類和結構體
在面試的時候,咱們常常被問的一個問題(還有另一個問題,如何選擇抽象類和接口,下次我會單獨聊聊這個問題),下面咱們來聊聊在設計時應該如何選擇結構體和類
都說程序是一門注重實踐的學科,可是也只有熟悉理解了這些概論的東西,才能在實踐時寫出優秀的代碼,有不對或者不合理的地方歡迎在下面討論;