Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# i收集<;T>;不';没有添加范围,但列出<;T>;是的,演员演得不好吗_C# - Fatal编程技术网

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
,的性能,与此方法不同,as
List.AddRange
可以防止备份数组多次调整大小。@请注意,这是正确的,但仅当
项为ICollection
,在这种情况下也是
List.AddRange
为新项分配数组,用序列填充它,然后将其复制回列表,所以你得到了两份数据。是的,这更是我想要的。所以我的理解是,向客户机公开接口,但在内部只使用具体的实现。