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