|
|
|
|
|
在本文中,我們將看到兩種存儲類型:ArrayList
和 List
,我將從5個方面對它們進行比較,并最后提出使用建議。
概述
ArrayList
是一種非泛型集合類型,允許用戶存儲任何數(shù)據(jù)類型的對象,它在System.Collections
命名空間下可用。
List
是一種通用集合類型,允許用戶存儲聲明時由 List
指定的數(shù)據(jù)類型的對象。它是一個非常強類型的集合,在System.Collections.Generic
命名空間下可用。
ArrayList
類用于在 C# 中聲明一個 ArrayList。ArrayList
在其中存儲對象引用。這意味著 ArrayList
可以在其中存儲多種數(shù)據(jù)類型的數(shù)據(jù),如整數(shù)、字符串、浮點數(shù)等。下面的代碼示例向我們展示了如何在 C# 中初始化 ArrayList
。
ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony");
foreach (var x in array1)
{
Console.WriteLine(x);
}
輸出
1
Pony
在上面的代碼中,我們創(chuàng)建了ArrayList
類的實例:array1
,并在其中存儲了不同數(shù)據(jù)類型的不同值。
通用列表用于保存 C# 中一種特定數(shù)據(jù)類型的數(shù)據(jù)。List
類用于在 C# 中聲明特定數(shù)據(jù)類型的列表。我們需要在聲明時指定列表的數(shù)據(jù)類型。下面的代碼示例向我們展示了如何在 C# 中初始化 List
。
List<int> list1 = new List<int>();
list1.Add(1);
list1.Add(2);
foreach (var x in list1 )
{
Console.WriteLine(x);
}
輸出
1
2
在上面的代碼中,我們創(chuàng)建了List
類的實例:list1
,它包含整數(shù)數(shù)據(jù)類型和存儲的整數(shù)值。
比較 ArrayList 和 List
讓我們嘗試比較不同類別下的 ArrayList
和 List
。
從本質(zhì)上講,ArrayList
包含一個異構(gòu)的對象集合,這意味著在 ArrayList
的單個實例中,我們可以存儲任何數(shù)據(jù)類型的對象。而 List
被設(shè)計為僅保存同類對象的集合,這意味著在單個實例中,我們只能存儲一種數(shù)據(jù)類型的對象。
讓我們看一個 ArrayList
存儲不同對象類型的例子:
using System.Collections;
var arrayList = new ArrayList();
arrayList.Add(1); // integer
arrayList.Add(2);
arrayList.Add("3"); // string
現(xiàn)在讓我們看一個關(guān)于 List
的例子,它只允許一種對象:
using System.Collections.Generic;
var list = new List<int>();
list.Add(1); // allows only integer values
list.Add(2);
list.Add(3);
使用 ArrayList
,在訪問存儲異構(gòu)對象的集合時,我們總是可以預(yù)料到運行時錯誤。但是 List
是一個強類型集合,它允許定義T為List<T>
,因此,如果我們試圖存儲為T指定的以外的任何內(nèi)容,應(yīng)用程序?qū)伋?strong>編譯時錯誤。
現(xiàn)在,使用相同的list
實例,如果我們嘗試添加一個字符串,我們將面臨編譯錯誤:
list.Add("4"); // 拋出編譯時錯誤
我們在使用 ArrayList
時,經(jīng)常需要我們對正在訪問的對象進行裝箱或拆箱,以避免出現(xiàn)任何錯誤。但是對于 List
,情況絕非如此。
讓我們看看如何:
int sum = 0;
foreach (var item in arrayList)
{
sum += Convert.ToInt32(item);
}
Console.WriteLine($"Sum is {sum}");
輸出
Sum is 6
正如我們在 ArrayList
中看到的那樣,我們必須使用Convert.ToInt32()
轉(zhuǎn)換"3"為3,才能使計算正常進行并避免運行時錯誤。
但對于 List
,我們不需要這樣做:
int sum = 0;
foreach (var item in list)
{
sum += item;
}
Console.WriteLine($"Sum is {sum}");
輸出仍然是一樣的:
Sum is 6
正如我們所看到的,List
是類型安全的,我們根本不需要進行任何類型轉(zhuǎn)換。
通常,List
比 ArrayList
更節(jié)省內(nèi)存,因為它不必為集合中的每個元素存儲對象引用。相反,它將元素直接存儲在數(shù)組中。而 ArrayList
將元素存儲在內(nèi)部數(shù)組中,并且當(dāng)我們增加數(shù)組大小時需要分配額外的內(nèi)存。
從我們目前所看到的來看,List
比 ArrayList
的內(nèi)存效率更高。此外,類型安全使其比 ArrayList
的性能更高效。與 ArrayList
相比, List
具有更好的 API 支持,并且通過它提供的方法和屬性可以更快地訪問元素。參閱文章:
使用偏好
正如我們現(xiàn)在所知,ArrayList
可以靈活地存儲任何數(shù)據(jù)類型的對象,因此如果類型安全確實不是問題,我們可以使用它。此外,如果我們正在開發(fā)的應(yīng)用程序的目標(biāo)是 .NET Framework 版本.NET 2.0 或更低版本,我們可以繼續(xù)使用 ArrayList
。但是,如果我們正在使用等于或高于 .NET 3.0 的框架,我們總是可以更喜歡 List
而不是 ArrayList
,原因有很多,我們在前面的部分已經(jīng)看到了。
使用 ArrayList 和 List 時的建議
到目前為止,我們已經(jīng)可以看到我們可以使用這兩個集合來執(zhí)行類似的功能。然而 List
是 ArrayList
的更新更好的版本。
俗話說——新的總是更好的。對于任何新的開發(fā),List
應(yīng)該始終是我們的首選。其實微軟也是這么建議的。僅當(dāng)應(yīng)用程序仍以低于 .NET 3.0 的框架為目標(biāo)或絕對必要時,我們才可以使用 ArrayList
。
總結(jié)
在本文中,我們了解了 ArrayList
和 List
以及何時使用它們。很明顯,List
在任何比較中都勝過 ArrayList
,因為它更高效、更好且類型安全。
相關(guān)文章