【问题标题】:Are Strongly typed ArrayLists the better choice in C#?强类型的 ArrayList 在 C# 中是更好的选择吗?
【发布时间】:2010-12-16 16:45:16
【问题描述】:

当我在 C# 中编程时,有时我需要一个强类型集合:

我经常创建一个继承自ArrayList的类:

using System.Collections;
public class Emails: ArrayList
{
  public new Email this[int i]
  {
     get
     {
        return (Email)base[i];
     }
     set
     {
        base[i] = value;
     }
  }
}

我意识到这可能不是从集合继承的正确方法。如果我想从 C# 中的强类型集合继承,我应该怎么做,我应该选择从哪个类继承?

【问题讨论】:

  • 一般来说,我大部分时间都尽量避免实现继承,除非其他方法明显更尴尬。太容易绊倒了。

标签: c# .net arraylist


【解决方案1】:

你想要的是一个通用,比如List<T>

public class Emails : List<Email>
{
}

这包含 ArrayList 的所有方法,然后是一些方法,您无需做任何额外的工作即可获得类型安全。

但是请注意,从List&lt;T&gt; 继承有时会给您带来比其价值更多的麻烦。更好的办法是实现ICollection&lt;T&gt;IEnumerable&lt;T&gt;,并在内部使用List&lt;T&gt;来实现接口。

【讨论】:

  • 感谢这里的每一个人如此迅速地回答。我马上改掉我的坏习惯!
  • 喜欢这种方法。 ;) 我在编码并且需要一组带有快速索引器的对象时经常使用它。
  • 不要从 List 继承。就用它吧。如果你真的想要一个新类型,创建一个别名。
  • -1 不是正确答案。从 List 派生充满了问题。 +1 乔尔·科霍恩。
  • @Joel - 别名不是必须在每个文件中重复吗?
【解决方案2】:

忘记 ArrayList 和 List。 “正确”的做法是从 Collection 派生并将您的类称为以 Collection 结尾的东西。

public sealed class EmailCollection : Collection<Email>
{

}

【讨论】:

  • @Josh- 我明白了。我同意您使用的语法(emailCollection)更有意义,并且您确切地知道您指的是什么!但是,是什么让您在 dotnet 框架提供的所有不同可能性中做出选择:集合。 [使用 System.Collections.ObjectModel;] 这与 List 或 ArrayList 具有基本相同的方法这是性能方面的问题,还是只是品味和习惯的问题?
  • 嗯,Collection(T) 被设计为用作基类。因此,如果您要派生自己的类以在对象模型中公开,那将是我会使用的。如果不公开它,那么我会使用 List 但不会从中派生 - 我只会创建一个 List(Email)。至于命名,它只是一个约定,例如 FooCollection,而不是 Foos。
  • 使用 Collection(T) 或 IEnumerable(T) 是为您的域建模的好习惯。其他需要考虑的事情:当你向调用者公开这个集合时,他们会修改它吗?他们想要通过索引访问元素会很常见吗?他们需要知道集合中元素的数量吗?很多时候 Collection(T) 就足够了,然后你没有暴露没有意义的功能。例如,如果您的收藏通过网络传输,例如WCF,它有一个 Add() 方法有意义吗? Add() 不应该发生在您的服务层上吗?
【解决方案3】:

如果您不使用 .Net 1.1,您真的应该忘记 ArrayList 并改用通用的 List&lt;T&gt;。您可以获得强大的输入和更好的启动性能。

【讨论】:

    【解决方案4】:

    一般情况下,如果可能,应避免使用new 进行成员声明。

    从 C# 2 开始,您可以使用泛型。 List&lt;email&gt; list = new List&lt;email&gt;();

    【讨论】:

      【解决方案5】:

      并非如此,这就是泛型的用途。

      【讨论】:

        【解决方案6】:

        泛型似乎更合适。例如,

        List<email> 
        

        在这种情况下。为什么要重新发明轮子并表现得更差?

        【讨论】:

          【解决方案7】:

          如果你使用 .net 2.0 或 + 我会选择通用集合

          【讨论】:

            猜你喜欢
            • 2011-03-17
            • 1970-01-01
            • 2013-08-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-16
            • 1970-01-01
            • 1970-01-01
            • 2012-07-04
            相关资源
            最近更新 更多