当我们可以在ArrayList中存储事物(值和ref)时,为什么我们有泛型?

时间:2009-11-30 11:36:47

标签: c# generics

  

可能重复:
  What is cool about generics, why use them?

DUPLICATE:

What is cool about generics, why use them?


我的基本问题与标题相同。但我想知道更多可以通过C#泛型世界启发我的东西。

谢谢! Aakash

4 个答案:

答案 0 :(得分:4)

使用泛型列表而不是ArrayList的一个原因是ArrayList接受任何类型的对象,如果您只想存储给定类型的对象,这可能会导致运行时错误泛型。

示例:

var numbers=new ArrayList();
numbers.Add(1);
numbers.Add("abcd"); //This will compile!

int theNumber=(int)numbers[1]; //This will cause an exception

使用通用列表时,确保列表中只存储了所需的类型:

var numbers=new List<int>();
numbers.Add(1);
numbers.Add("abcd"); //This will NOT compile

答案 1 :(得分:0)

一个简单的解释。

当你有一个整数列表时,你只想确保程序的某些部分在其中添加一个字符串。使用泛型,您告诉编译器您决定在列表中只有整数(或任何类型),这样可以确保您不违反自己的法则。

您可以说,在代码中表达您的意图是另一种语言(和运行时)功能。这允许工具为您提供支持。

答案 2 :(得分:0)

除了Konamiman和Stefan的答案之外,在处理价值类型时使用通用集合也可以避免装箱/拆箱的成本。

每次向非泛型集合添加值类型时,都需要将其装箱,然后在从集合中删除它时需要将其取消装箱(假设您要执行任何类型特定的操作)用它)。

ArrayList myList = new ArrayList();
myList.Add(42);             // box
myList.Add(DateTime.Now)    // box
myList.Add(3.14)            // box

int x = (int)myList[0];              // unbox
DateTime y = (DateTime)myList[1];    // unbox
double z = (double)myList[2];        // unbox

答案 3 :(得分:0)

正如之前的海报所说,使用通用集合有一个编译时安全方面;他们可以在编译时捕获一些愚蠢的错误(这比运行时更好)。

然而,还有一些其他理由更喜欢它们:

  1. 虽然有一个很小但偶尔非常相关的性能优势。如果您在内部循环中处理大量的集合操作,那么运行时必须执行的不必要的类型检查会添加。如果你计算一个arraylist中的整数之和,那么使用List<int>商店的等价方法的代码要慢一些。
  2. 很简单,但在我看来非常相关,泛型集合不仅是可编译的编译时间,而且是“编码”时间。这样就可以实现智能感知,这是一个很棒的功能。
  3. 即使您使用具有不确定类型值的这些集合,通常也会获得更具吸引力的快速错误处理。
  4. 例如:

    object x = "5";
    
    var intlist = new List<int>();
    intlist.Add((int)x); //fails early; compiler requires this cast
    //...perhaps much later...
    foreach(int num in intlist)...
    
    var arraylist = new ArrayList();
    arraylist.Add(x); //this is OK though a cast would be advisable
    //...perhaps much later...
    foreach(int num in arraylist) ... //fails late
    

    由于检测到故障的点从原始编码错误中进一步消除,因此延迟故障比早期故障更难调试。