2009-11-14 53 views
4

当我编程在C#中,有些时候我需要一个强类型集合:强类型ArrayLists是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#中的强类型集合继承,我应该怎么做,以及我应该选择从哪个类继承?

+0

一般来说,我会尽量避免实现继承,除非其他方法明显更尴尬。绊倒太容易了。 – 2009-11-15 03:46:52

回答

15

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

public class Emails : List<Email> 
{ 
} 

这具有ArrayList的所有方法,然后是一些,并且您可以获得类型安全性,而无需执行任何额外的工作。

但是,请注意,从List<T>继承有时会导致更多的麻烦,而不是它的价值。更好的主意是实现ICollection<T>IEnumerable<T>,并在内部使用List<T>来实现接口。

+0

感谢这里所有人的回答如此之快。我马上改变我的坏习惯! – Tom 2009-11-14 23:43:26

+0

喜欢这种方法。 ;)在编码时我使用它很多,并且需要一组带有快速索引器的对象。 – Zack 2009-11-15 00:44:12

+7

请勿继承列表。只要使用它。如果您确实需要新类型,请创建一个别名。 – 2009-11-15 01:10:20

2

不是真的,这是泛型的用途。

3

一般而言new应尽可能避免成员声明。

从C#2开始,尽管您可以使用泛型。 List<email> list = new List<email>();

5

如果你没有使用.Net 1.1,你应该忘记ArrayList,并使用通用的List<T>来代替。你的打字能力更强,性能更好。

1

泛型似乎更合适。例如,

List<email> 

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

0

如果你使用.NET 2.0或+我会用一个泛型集合去

9

忘记了ArrayList和列表。要做的“正确”事情是从Collection中派生出来,然后给你的类调用以Collection结尾的东西。

public sealed class EmailCollection : Collection<Email> 
{ 

} 
+0

@乔什 - 我明白了你的观点。我同意你使用的语法(emailCollection)更有意义,你完全知道你指的是什么!但是,在dotnet框架提供的所有不同可能性中,您选择什么:集合。 [使用System.Collections。ObjectModel;] 这与List或ArrayList的方法大体相同 性能是否明智,还是仅仅是品味和习惯的问题? – Tom 2009-11-15 17:44:08

+0

那么,集合(T)被设计为用作基类。所以如果你要派生自己的类来暴露在对象模型中,那将是我会使用的。如果不暴露它,那么我会使用列表,但不会从它派生 - 我只是创建一个列表(电子邮件)。至于命名它,它只是一个公约FooCollection,例如与Foos相对。 – Josh 2009-11-15 19:15:25

+2

使用集合(T)或IEnumerable(T)是进行域建模的好习惯。 要考虑的其他事情:当你将这个集合公开给调用者时,他们会修改它吗?他们希望通过索引访问元素是否很常见?他们是否需要知道集合中元素的数量? 很多时候一个Collection(T)就足够了,然后你没有公开那些没有意义的功能。例如,如果你的收藏品通过电线,例如, WCF,它是否有意义,它有一个Add()方法?不应该添加()发生在您的服务层上吗? – 2010-04-05 02:24:00

相关问题