强类型ArrayLists是C#中更好的选择吗?

Tom*_*Tom 4 .net c# arraylist

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

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

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

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

JSB*_*ոգչ 15

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

public class Emails : List<Email>
{
}
Run Code Online (Sandbox Code Playgroud)

这有ArrayList的所有方法,然后是一些,你可以获得类型安全而无需做任何额外的工作.

但请注意,继承List<T>可能会导致您遇到更多麻烦.更好的想法是实现ICollection<T>IEnumerable<T>使用List<T>内部实现接口.

  • 不要从List <T>继承.只是使用它.如果您确实需要新类型,请创建别名. (7认同)
  • -1不是正确的答案.从List <T>派生出现问题.给Joel Coehoorn +1. (2认同)

Jos*_*osh 9

忘记ArrayList和List.要做的"正确"的事情是从Collection派生出来并将你的类称为以Collection结尾的东西.

public sealed class EmailCollection : Collection<Email>
{

}
Run Code Online (Sandbox Code Playgroud)

  • 使用Collection(T)或IEnumerable(T)是进行域建模的好习惯.需要考虑的其他事项:当您将此集合公开给调用者时,他们会修改它吗?他们想要通过索引访问元素是否常见?他们是否需要知道集合中的元素数量?通常,Collection(T)就足够了,然后您没有暴露无意义的功能.如果您的集合通过线路,例如,例如WCF,它是否有意义使用Add()方法?不应该在服务层上发生Add()吗? (2认同)

Yan*_*rtz 5

如果你没有坚持.Net 1.1,你真的应该忘记ArrayList并使用泛型List<T>.您可以获得强大的打字和更好的性能.