Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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# 列表<;T>;暴露为IEnumerable<;T>;_C#_Generics_.net - Fatal编程技术网

C# 列表<;T>;暴露为IEnumerable<;T>;

C# 列表<;T>;暴露为IEnumerable<;T>;,c#,generics,.net,C#,Generics,.net,我理解两者之间的层次结构,知道如何在它们之间转换,但是像这样声明列表有什么根本性的错误吗 IEnumerable<int> _bookmarkedDeals = new List<int>(); IEnumerable\u bookmarkedDeals=new List(); 我不需要在任何时候更改列表,它可以作为一个整体创建或重新创建 作为替代方案,可能是这样 IEnumerable<int> _bookmarkedDeals = Enumerable

我理解两者之间的层次结构,知道如何在它们之间转换,但是像这样声明列表有什么根本性的错误吗

IEnumerable<int> _bookmarkedDeals = new List<int>();
IEnumerable\u bookmarkedDeals=new List();
我不需要在任何时候更改列表,它可以作为一个整体创建或重新创建

作为替代方案,可能是这样

IEnumerable<int> _bookmarkedDeals = Enumerable.Empty<int>();
IEnumerable\u bookmarkedDeals=Enumerable.Empty();

您的声明绝对没有问题,尽管有些人喜欢在没有任何抽象的情况下精确地声明变量类型。

该声明没有错,但除非您有任何特定的限制,
IList
是一个更适合列表的接口。

没有错


如果您从未以任何方式更改列表,您可能会使用一个数组-它比列表轻一些。

它没有根本上的问题,但是为什么您要切掉列表提供的一些功能(IEnumerable没有)?

没有问题,这是一个好的设计。 读一读。
阅读有关选择正确界面的精彩文章。

不,没有问题


如果这是一个局部变量,我认为仅仅使用
var
创建
List
类型的变量没有什么好处。如果你只是在列举,那也没什么坏处。如果它是一个字段,可能是公开的事件,那么不将其作为
列表
IList
公开是非常明智的,以保持对具体类型的自由选择。

在这种情况下,
\u bookmarkedDeals
将是空的,因此声明有些无用。也就是说,将列表视为IEnumerable没有什么错。

没有语法问题,但我不认为它有什么用处。如果您不在此行中插入任何项目,此列表将始终保持为空,除非您将其转换回
列表
,那么为什么要将其声明为
IEnumerable

(与此处的所有答案不同)。这个声明有很大的问题。如果不将所有时间强制转换回列表,您将无法使用任何
List
功能


如果以后不执行列表操作,则从方法返回此类型是一种很好的做法。但是,当您使用相同的方法时,您只是使您的生活变得更困难,性能更低(因为强制转换)。

这是有效的代码,但是如果您的实现是不变的,为什么不使用简单的数组呢
IEnumerable\u bookmarkedDeals=new int[x]
因为列表有一些开销,所以您不会使用需要它为空的\u bookmarkedDeals做什么?@James我的猜测是,该变量将直接为其分配另一个序列,而不是修改为向列表中添加项目。若并没有发生这种情况,那个么公开它的任何包装器都应该返回一个空序列(而不是null)。至少,这是我的理论。“这里的所有答案”太笼统了:具体来说,我的答案的第一部分正是关于这种差异。你是对的。我只是想强调一点,以这种方式使用它是不好的做法。好吧,如果你最终需要
List
而不是
IEnumerable
提供的功能,那就错了。在这些情况下,您可能无法执行您需要的操作,您将强制转换它,在这种情况下,您最好将变量保留为
列表
,或者您最终执行类似于调用
ToList
的操作,这是非常低效的。如果你把它当作一个IEnumerable,那就好了。如果您需要列表功能,则不需要。为什么要将其从
List
强制转换为
IList
。它的限制性更大,除非您将非
列表的其他对象分配给该变量,否则您不会得到任何东西。@Sevy:
IList
它比
IEnumerable
更具限制性,但限制性更小。我假设他将对象暴露于外部世界,这就是他使用接口的原因。嗯,它是一个字段,所以我真的希望他不会将它暴露于整个世界。如果有一个方法或属性包装它并公开它,那么这就是使用接口限制可以在外部执行的操作的地方。私有字段通常最好保留最派生的类型。