簡體   English   中英

ICollection的 <T> 沒有AddRange而是List <T> 是的,是鑄造壞

[英]ICollection<T> doesn't have AddRange but List<T> does, is Casting Bad

所以在我的課上我有這個私人只讀成員ICollection<IMusicItem> playlist 我更喜歡使用接口ICollection<T>

我想使用List<T>.AddRange(IEnumerable<T> items) 在我的方法中將ICollection轉換為List<T>危險的 ,即使我在構造函數中將ICollection<T>實例化為new List<T>()也是如此。

這是不好的做法,還有更好的方法嗎?

或者只有List<T>才更好

這是不好的做法,因為它破壞了封裝。 使用接口是好的,但是如果必須將對象強制轉換為具體類型則沒有意義。 好像你不知道具體的類型,或者如果你決定稍后再切換到另一種類型,它就是未來的錯誤。

請改用擴展方法:

public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> items)
{
    foreach (var item in items)
        collection.Add(item);
}

注意:最好在公共API中公開接口,以便以后可以自由更改實現對象,但是在私有字段上是否可以進行樣式處理。 你也可以使用具體的課程。

它沒有危險(做對了),沒有意義。

if (playlist is IList<IMusicItem>)
{
  (playList as IList<IMusicItem>).AddRange(items);
} 
else
{
   // still need a foreach here
}

真正的問題是“我更願意使用接口ICollection<T> ”。

為什么呢? 你的問題表明它總是一個List,所以為什么不公開它呢?

將其公開為更一般的ICollection<>只有當List之外的其他實現可能存在時才有意義,然后轉換是無用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM