C# i收集<;T>;不';没有添加范围,但列出<;T>;是的,演员演得不好吗
因此,在我的课堂上,我有一个私人只读成员C# i收集<;T>;不';没有添加范围,但列出<;T>;是的,演员演得不好吗,c#,C#,因此,在我的课堂上,我有一个私人只读成员ICollection playlist。我更喜欢使用接口I收集 我想使用List.AddRange(IEnumerable items)。在我的方法中,即使我在构造函数中将ICollection实例化为new List(),将ICollection强制转换为List也是危险的 这是一种不好的做法吗?有没有更好的方法 或者最好有一个列表这是一种不好的做法,因为它破坏了封装。使用接口是好的,但如果必须将对象转换回具体类型,则没有意义。表现得好像你不知道具体的
ICollection playlist
。我更喜欢使用接口I收集
我想使用List.AddRange(IEnumerable items)
。在我的方法中,即使我在构造函数中将ICollection
实例化为new List()
,将ICollection
强制转换为List
也是危险的
这是一种不好的做法吗?有没有更好的方法
或者最好有一个
列表
这是一种不好的做法,因为它破坏了封装。使用接口是好的,但如果必须将对象转换回具体类型,则没有意义。表现得好像你不知道具体的类型,或者如果你以后决定切换到另一种类型,这将是一个未来的bug
请改用扩展方法:
public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> items)
{
foreach (var item in items)
collection.Add(item);
}
publicstaticvoidaddrange(此ICollection集合,IEnumerable项)
{
foreach(项目中的var项目)
集合。添加(项目);
}
注意:最好在公共API中公开接口,这样以后就可以自由地更改实现对象,但是否在私有字段中这样做是风格问题。你也可以使用混凝土类。它没有危险(如果做得好),只是毫无意义
if (playlist is IList<IMusicItem>)
{
(playList as IList<IMusicItem>).AddRange(items);
}
else
{
// still need a foreach here
}
if(播放列表为IList)
{
(播放列表为IList)。添加范围(项目);
}
其他的
{
//这里还需要一个foreach吗
}
真正的问题是“我更愿意使用接口ICollection
”
到底为什么?你的问题表明它总是一个列表,那么为什么不公开它呢
仅当可能存在列表以外的其他实现时,将其公开为更通用的
ICollection
才有意义,然后强制转换是无用的 也许可以使用扩展方法,如中?您可以为任何T
集合创建扩展方法AddRange
。一个泛型。你坚持私有成员的接口类型的原因是什么,特别是当你实例化一个具体类型,让你做你想做的事情时?这是一个很好的观点actually@CallumLinington接口是功能强大的工具,但使用它们并不是万能的。接口的目的是允许您编写只依赖于接口行为的代码,并且可以为其提供多个透明的不同具体实现。在这里,接口没有提供所需的行为,您依赖于具体类型的行为。您应该在变量的类型中反映这种依赖性,而不是删除静态类型并声称您不依赖实际上依赖的内容。请注意,这会显著降低LIst.AddRange
,的性能,与此方法不同,asList.AddRange
可以防止备份数组多次调整大小。@请注意,这是正确的,但仅当项为ICollection
,在这种情况下也是List.AddRange
为新项分配数组,用序列填充它,然后将其复制回列表,所以你得到了两份数据。是的,这更是我想要的。所以我的理解是,向客户机公开接口,但在内部只使用具体的实现。