强类型数组列表是C#中更好的选择吗?

强类型数组列表是C#中更好的选择吗?,c#,.net,arraylist,C#,.net,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; } } } 我意识到这

使用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#2开始,尽管可以使用泛型<代码>列表=新列表()

如果您没有被.Net 1.1所困扰,那么您真的应该忘记
ArrayList
,而使用通用
列表。您可以获得强大的类型和更好的启动性能。

您需要的是一个通用的,如
列表

公共类电子邮件:列表
{
}
这包含了ArrayList的所有方法,还有一些方法,您可以在不做任何额外工作的情况下获得类型安全性


但是,请注意,从
列表继承
有时会给您带来更多的麻烦。更好的方法是实现
ICollection
IEnumerable
,并在内部使用
列表来实现接口。

泛型似乎更合适。比如说,

List<email> 
列表

在这种情况下。为什么要改头换面,结果会更糟?

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

忘掉ArrayList和List。“正确”的做法是从集合中派生并调用以集合结尾的类

public sealed class EmailCollection : Collection<Email>
{

}
公共密封类EmailCollection:集合
{
}

感谢在座的每一位如此快速的回答。我马上改变我的坏习惯!我喜欢这种方法我在编码时经常使用它,需要一组具有快速索引器的对象。不要从列表继承。就用它吧。如果您真的想要一个新类型,请创建一个别名。-1不是正确答案。从列表中派生出来是充满问题的+1到Joel Coehoorn。@Joel-别名不是必须在每个文件中重复吗?一般来说,我大多数时候都尽量避免实现继承,除非其他方法非常笨拙。这太容易被绊倒了。@Josh-我明白你的意思了。我同意你使用的语法(emailCollection)更有意义,你确切地知道你指的是什么!但是,是什么让你在dotnet框架提供的各种可能性中做出选择:集合。[使用System.Collections.ObjectModel;]这与List或ArrayList的方法基本相同,这是性能方面的问题,还是仅仅是品味和习惯的问题?Collection(T)被设计为用作基类。因此,如果您要派生自己的类以在对象模型中公开,我会使用它。若你们并没有公开它,那个么我会使用列表,但不会从中派生——我只会创建一个列表(电子邮件)。至于命名,它只是一个约定的FooCollection,例如,与Foos相反。使用Collection(T)或IEnumerable(T)对域建模是一个好习惯。需要考虑的其他事项:当您向调用者公开此集合时,他们会修改它吗?他们希望通过索引访问元素,这是常见的吗?他们需要知道集合中元素的数量吗?通常一个集合(T)就足够了,然后您没有公开没有意义的功能。例如,如果您的集合跨越了网络,例如WCF,那么使用Add()方法是否有意义?Add()不应该发生在您的服务层上吗?
public sealed class EmailCollection : Collection<Email>
{

}