[英]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.