【问题标题】:Why do we have generics when we can store things(values and ref) in a ArrayList? [duplicate]当我们可以将事物(值和引用)存储在 ArrayList 中时,为什么还要使用泛型? [复制]
【发布时间】:2010-12-21 14:47:18
【问题描述】:

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

复制:

What is cool about generics, why use them?


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

谢谢! 阿卡什

【问题讨论】:

标签: c# generics


【解决方案1】:

使用通用列表而不是 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

【讨论】:

  • 你的答案比我快 10 秒 :-)
  • 不一样,我有示例代码;-)
  • 我决定添加一个示例,但看到您已经编写了它... :-)
【解决方案2】:

一个简单的解释。

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

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

【讨论】:

    【解决方案3】:

    根据 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
    

    【讨论】:

      【解决方案4】:

      正如之前的海报所说,使用泛型集合存在编译时安全问题;他们可以在编译时发现一些愚蠢的错误(这比在运行时更好)。

      不过,还有一些其他原因更喜欢它们:

      1. 有一个很小但有时非常相关的性能优势。如果您在内部循环中处理大量收集操作,则运行时必须执行的不必要的类型检查会加起来。如果您要计算数组列表中整数的总和,预计代码会比使用 List&lt;int&gt; 存储的等效方法慢。
      2. 微妙地,但在我看来,泛型集合不仅是可分析的编译时间,而且是“编码”时间。这会启用智能感知,这是一个很棒的功能。
      3. 即使您将这些集合与不确定类型的值一起使用,您通常也会获得更具吸引力的快速失败错误处理。

      例如:

      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
      

      后期故障比早期故障更难调试,因为检测到故障的点已从原始编码错误中进一步消除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        相关资源
        最近更新 更多