程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#中的引用類型和值類型,

c#中的引用類型和值類型,

編輯:C#入門知識

c#中的引用類型和值類型,


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

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

    

    • 引用類型分配在托管堆上,值類型分配在線程棧上:其實這種說法的前半部分是對的,後半部分是錯的。因為變量的值在它聲明的位置存儲的,所以假如某一個引用類型中有一個值類型的變量, 那麼該變量的值總是和該引用類型的對象的其它數據在一起,也就是分配在堆上。(只有局部變量(方法內部聲明的變量)和方法的參數在棧上)
    • 結構是輕量級的類:這種錯誤的信息主要是因為有人認為值類型不應該有方法或者其它有意義的行為-它們應該作為簡單的數據轉移來使用,所以很多人分不清DateTime到底是值類型還是引用類型。
    • 對象在c#中默認的是用過引用傳遞的:其實在調用方法的時候,參數值(對象的一個引用)是以傳值得方式傳遞的,如果你想以引用方式傳遞的話,可以使用ref或者out關鍵字。

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

1 int i = 5;
2 object o = i;
3 int j = (int)o;
4 Int16 y=(Int16)o;

 

三,泛型的出現(本節只簡單介紹泛型對裝箱和拆箱所起的作用,關於泛型的具體細節請參考下一篇文章)

    •  什麼泛型
      • 泛型是CLR和編程語言提供的一種特殊機制,它在c#2中才被提供出來。
    •  它對避免裝箱有什麼作用?
      • 在使用泛型時需要指定要裝配的類型,這樣可以減少裝箱操作,比如下面的代碼
         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>時就不會進行裝箱操作,從而提高應用程序的性能。

    •  C#中常見的泛型集合:

      Queue<T>;

      Stack<T>;

      List<T>;

      Dictionary<Tkey,Tvalue>;

      HashSet<T>;

       

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

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

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

    •  什麼是結構體
      • 結構體是一種特殊的值類型,所以它擁有值類型所以的特權(實例一般分配在線程棧上)和限制(不能被派生,所以沒有 abstract 和 sealed,未裝箱的實例不能進行線程同步的訪問)。
    •  什麼情況下選擇結構體,什麼情況下選擇類
      • 在大多數的情況下,都應該選擇類,除非滿足以下情況,才考慮選擇結構體:
      • 類型具有基元類型的行為
      • 類型不需要從其它任何類型繼承
      • 類型也不會派生出任何其它類型
      • 類型的實例較小(約為16字節或者更小)
      • 類型的實例較大,但是不作為方法的參數傳遞,也不作為方法的返回值。

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved