1. 程式人生 > >【C#學習】從泛型集合到強制轉換,start brain storm~

【C#學習】從泛型集合到強制轉換,start brain storm~

        大話設計模式的時候,提到了一個迭代器模式,由於高階語言對迭代器模式功能進行了很好的封裝,所以這個模式就不太常用。不過,我想說的重點是,迭代器模式裡提到的一個概念“非泛型集合”。由於不明白什麼意思,於是我就去問了度娘。不過我發現“泛型集合”比非泛型集合更有料。

 
泛型集合

        泛型集合就是泛泛的集合,不確定的型別的集合。好吧,這個答案給的太精闢,找了很多資料還是沒有很通俗的理解。小編了解的到的有 ListDictionary 兩個屬於泛型結合。ArrayListHashtable 兩個屬於非泛型集合。

 
泛型集合相比非泛型集合優勢所在:

1.型別更安全,只包含我們指定的型別。

2.大幅減少了構建自定義結合型別的需要(只有類、結構、介面和委託可以使用泛型,列舉型別不可以。)

——什麼是列舉

答:就像一週有周一到週日七天,週日就是一個列舉。一年有1月到12月有12個月。2月就是一個列舉。

事先考慮到某一變數可能取的值(週一到週日),儘量用自然語言中含義清楚的單詞來表示(sunmon tue)它的每一個值,這種方法稱為列舉方法,用這種方法定義的型別稱列舉型別( day type)

3.提供了更好的效能,不會導致裝箱或拆箱的損耗

到這第三點,感覺更糊塗了。什麼是拆裝箱啊?小編記得在C#視訊了也有提到,看大家的部落格評論的時候也有看到,於是知識點和知識點之間的聯絡這麼就來了,一張小知識網就構建

ing

淺識拆裝箱

裝箱——是值型別轉成object引用型別,裝進去。

拆箱——是已被裝箱的引用型別轉成原來的值型別。拆開,拿出來。

裝箱和取消裝箱使值型別能夠被視為物件。把int型別,object型別作為物件看待了。

拆裝箱程式碼的舉例

namespace拆箱裝箱
{
    class Program
    {
        static void Main(string[] args)
        {
            //裝箱,int 型別變成object引用型別
            int num = 10;
            object obj = num;
 
            Console.WriteLine(obj);
            Console.ReadKey();
 
            //拆箱 已經被裝箱的obj引用型別轉換為int型別
            int num = 10;
            object obj = num;
 
            int number =(int)obj;//強制轉換
 
            Console .WriteLine (number );
            Console .ReadKey ();
 
 
 
        }
    }
}
 


       非泛型集合要進行拆裝箱來進行取值賦值。而拆裝箱的損耗體現在,不同型別資料轉換期間會有資源的損耗,會造成執行速度的下降。所以儘量使用泛型集合,減少非泛型集合的使用。

       以上的程式碼註釋裡提到了,強制轉換,聽著耳熟。哦,想起來了,C#視訊裡講過強制轉換的概念,但是自己還是理解不是很好,於是乎,再把知識回顧一下吧。

強制轉換

定義:程式要求一定要將某一型別的資料轉換為另外一種型別,則可以利用強制型別轉換運算子進行轉換,這種強制轉換過程稱為顯式轉換(強制轉換)。

轉換前提:資料型別相容

目的:

強制型別轉換的目的是使表示式的值的資料型別發生改變,從而使不同型別資料之間的運算能夠進行下去。

強制轉換的3種辦法:

舉個栗子1:加()進行轉換。如double型別的資料要想轉換為 int型別的資料。

            //強制轉換
            double num1= 555.5;
 
           //double想轉換為int,就在num1前加(),括號裡寫想轉換成為的數值型別--- int 。
            int num =(int)num1;
 
            Console.WriteLine(num);//輸出結果,555
            Console.ReadKey();


舉個栗子2:使用convert轉換,想使用什麼型別就to什麼型別。

           //強制轉換 convert
           Console.WriteLine ("輸入你的語文成績");
            stringstrChinese = Console.ReadLine();//使用了字串資料型別,來接收使用者的語文成績
           Console.WriteLine("輸入你的英語成績");
            stringstrEnglish = Console.ReadLine();
          
 
           //但只有數字型別才可以計算成績。
           int chinese = Convert.ToInt32(strChinese);//字串型別 strChinese 轉換成int型別
           int English= Convert.ToInt32(strEnglish);
 
           int sum =English + chinese;
           Console .WriteLine ("總成績為{0}",sum );
           Console.Read();
 


intchinese = Convert.ToInt32(strChinese);   string型別強制轉換為int型別。擁有面粉的人想吃麵包,他就需要一個工廠。而裡面的convert就像一個工廠,(strChinese)就像麵粉,int Chinese就是後門接受麵包的地方。怎麼樣,這樣解釋是不是就清晰一些了。如果你不想用這種方法,下面還為你準備了一種~

舉個栗子3int.tryParsestrings,out int resultstring轉換為int型別字, convert 類似

           Console.WriteLine("請輸入您的年齡");
           string strNum = Console.ReadLine(); //使用者輸入的也許是"18"  也許是 "lululu"
            int age =0;
 
           //要把字串轉換為int型別
           bool result = int.TryParse(strNum, out age); //方法返回值是bool型別,或者說int.TryParse要用bool型別變數來接收
 
            if(result)          
            {
                Console.WriteLine(age);  //輸入"18",result 為 true,輸出age 18
            }
            else
            {
               Console.WriteLine("您輸入的內容無法轉換成數字"); //輸入"lululu" ,result 為false,輸出此句話
            }
 


隱式轉換:

執行算術運算時,低型別(短位元組)可以轉換為高型別(長位元組)

例如:int型轉換成double型,char型轉換成int型等等;

舉個栗子: int型別可以隱式轉換為 double型別。

            //隱式轉換
            int number2 = 200;
            double number1 = number2;
            Console.WriteLine(number1);//F11除錯的時候,number顯示 200.0,但是F5執行完畢就是200,疑問??
            Console.ReadKey();


小編最美總結

       從迭代器模式的非泛型集合,到泛型集合,從泛型集合再到拆箱,裝箱,再到強制轉換。

因為自己對一些知識的理解不足,所以需要用B解釋A的時候,往往,我還要在找C去幫我理解B。其實我一開始真的只是打算寫寫泛型、拆箱裝箱那一點點淺淺的認識而已。

       這篇部落格的經歷了補充又補充,從一個點,到另一點,再到另外一個點。就像一次頭腦風暴。只有去實踐一次,你才能真正的體會到:知識不是孤島,找到聯絡,知識於你就是一片無垠的大陸。

新知識的學習建立在舊知識之上,知識節點相互聯絡,這,就是在構建你的知識網。

以上知識為個人理解,如有偏頗,請各位盡情指正。