之前兩篇文檔講述了C#中的面向對象的概念,其實這個概念對於很多種語言都是通用的,只不過每種語言具體實現的過程方法不一樣,比如Java、C++、python等,這些都是很流行的面向對象的語言在編程語言排行榜中都是屬於前幾名的。面向對象中比較難以理解的就是多態的概念,多態我將留到後面的章節去講,現在繼續 ...
之前兩篇文檔講述了C#中的面向對象的概念,其實這個概念對於很多種語言都是通用的,只不過每種語言具體實現的過程方法不一樣,比如Java、C++、python等,這些都是很流行的面向對象的語言在編程語言排行榜中都是屬於前幾名的。面向對象中比較難以理解的就是多態的概念,多態我將留到後面的章節去講,現在繼續先學習好基本的一些語法理解好語意才能更好的理解。
數組
數組顧名思義就是一組同類數據元素的集合,數組不單單是數字的集合,可以是多種類型的,但是集合中元素必須是同一種數據類型,那麼什麼是同類數據的元素呢?在第一篇中有介紹C#中15中最常用的數據類型(類型還可以自己擴展),每種類型有最大值最小值,每一個值就相當於是一個元素了,打個比如int類型的數組那就只可以存儲int的類型的元素,如果在int類型中存儲string類型,那麼編譯器或報錯,數組在C#中是最早出現的,在記憶體中是連續存儲的,所以它的索引速度非常快,下麵來看一下如果聲明一個數組。
這裡使用int類型:
1 //創建一個大小為3的數組 2 3 int[] intArray = new int[3]; 4 5 //賦值 6 7 intArray[0] = 1; 8 9 intArray[1] = 2; 10 11 intArray[2] = 3; 12 13 //修改 14 15 intArray[2]=4;
但是在數組中存在一些不足的地方,比如在數組的兩個數據之間插入數據是很麻煩,在插入數組後面的所有元素都要往後退一位,而且在聲明數組的時候必須指定數組的長度,數組的長度過長,會造成記憶體的浪費,過長也會造成數據溢出的錯誤,針對數組的這些缺點,又推出了ArrayList對象來剋服這些缺點。
ArrayList
在命名空間System.Collection中,ArrayLis存儲的對象元素是動態去分配的,根據需求去進行相應的擴容和收縮空間,所以在聲明ArrayLis對象時並不需要去指定它的長度。
1 //聲明一個ArrayList對象 2 ArrayList arrayList = new ArrayList(); 3 4 //新增數據 5 arrayList.Add(123); 6 arrayList.Add("Leon"); 7 8 //修改數據 9 arrayList[1] = 32; 10 11 //刪除 12 arrayList.Remove(0); 13 14 //插入數據 15 arrayList.Insert(0, 445);
從上面的例子中ArrayList好像是解決上面數組遺留下來的問題,當時當你實際編譯的時候就會遇到異常了,如果有在編譯器上實習輸入代碼編譯的同學會發現,arrayList.Add( )這個方法接受的是一個object的類型,那麼當我在arrayList[0],這個位置賦值的時候就會出現一個裝箱拆箱所帶來的性能損耗,而且在我第二次使用Add時插入的是一個string類型的變數,那麼同一個數組中出現兩種不一樣的數據類型,並且在編譯的時候是正常的,所以在編譯時不能檢查類型,在運行中就會出現錯誤。裝箱拆箱實際上就是object類型和其它類型之間的數據轉換所帶來的性能損耗,具體過程可以在網上查下資料。
泛型List
因為ArrayList存在不安全類型與裝箱拆箱的缺點,所以後面微軟又推出了泛型,List類和ArrayList類的用法相似,但是最關鍵的地方在於 List聲明集合的時候必須要指定數據對象的類型。
1 //聲明List集合對象 2 List<string> listString = new List<string>(); 3 4 //增加 5 listString.Add("leon"); 6 7 //修改 8 listString[0] = "newLeon"; 9 10 //刪除數據 11 listString.RemoveAt(0);
這裡可以看到,List和ArrayList的用法差不多,區別就在於List在聲明的時候必須要指定數據對象的類型,這樣如果嘗試在listString中插入int類型的值編譯器就會報錯,在編譯時就可以避免一個類型安全的問題,和裝箱拆箱帶來的性能損耗。
小結:
數組的存儲容量是固定的,每次只能對一個值去進行操作,而且在兩個值之間插入一個元素的話很麻煩,不方便操作。
ArrayList中雖然定義好的一套方法可以很方便的去操作數組,很好的刪除、插入元素,但是由於裝箱拆箱的過程會浪費很多資源,而且編譯時沒有提供一個安全類型的檢查,使得在一個有int類型的數組中允許插入其它類型的,比如string,這樣雖然在編譯時不會報錯,但是在運行時會發生異常。
泛型List,泛型int類型是強類型,在編譯時會檢查類型,並且減少裝箱拆箱帶來的損耗。
這裡註意數組可以是多維度的但是,ArrayList和List始終只具有一個維度。