2009-11-14 28 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

相關問題