C# 列表<&燃气轮机;与IEnumerable相比<>;,定义新类或新viewmodel类时

C# 列表<&燃气轮机;与IEnumerable相比<>;,定义新类或新viewmodel类时,c#,asp.net-mvc-3,entity-framework,C#,Asp.net Mvc 3,Entity Framework,我定义了一个新的ViewModel类,如下所示:- public class myviewmodel { public IEnumerable<Question> Questions { get; set; } public decimal Total { get; set; } public string Message { get; set; } } 公共类myviewmodel { 公共IEnumerable问题{get;set;} 公共十进制总数{

我定义了一个新的ViewModel类,如下所示:-

public class myviewmodel
{
    public IEnumerable<Question> Questions { get; set; }
    public decimal Total { get; set; }
    public string Message { get; set; }

}
公共类myviewmodel
{
公共IEnumerable问题{get;set;}
公共十进制总数{get;set;}
公共字符串消息{get;set;}
}
但我也可以把它定义为

public class myviewmodel
{
    public List<Question> Questions { get; set; }
    public decimal Total { get; set; }
    public string Message { get; set; }

}
公共类myviewmodel
{
公共列表问题{get;set;}
公共十进制总数{get;set;}
公共字符串消息{get;set;}
}
如果我想创建一个新的模型类,这种情况也会发生; 那么这两种方法之间的区别是什么呢?
BR

IEnumerable
更为抽象,如果可能的话,通常优先于
List
IList
。这仅仅是因为它是一个接口,您有更多的实现可能性


请参阅。

如果可能的话,我会远离
列表
而支持
ICollection
:使用“普通”列表会暴露太多关于实现的信息
IEnumerable
是一个不错的选择,因为它为您提供了选择实际实现的最佳灵活性,但如果您需要在不枚举集合的情况下找出可用元素的数量,它可能是不够的。

您也可以使用
IList

这两种方法的区别是什么

IEnumerable
更通用(但功能也更少)。您可以从任何Linq查询分配它,而不必担心实际的列表类型

列表
版本的定义更为严格,您可能必须先转换为列表,然后才能分配它。它确实为您提供了更多功能


您可能需要类似于IList的东西,这取决于您的需要。通常,您应该更喜欢返回接口,例如
ICollection
IList
IEnumerable
,因为它允许您在不破坏代码的情况下更改实际实现(只要实现遵守接口约定)


现在,您应该选择哪个接口取决于您需要做什么。例如,如果可以通过
Questions.add()
将项目添加到集合中,则不能使用
IEnumerable
,因为它不提供此类方法。

我认为其他人已经回答得很好,我只想添加一件事:


IList
ICollection
相比并不总是坏的,因为它应该表示内存中已经存在的信息(从而提供索引和
Count
属性)。在这种情况下(关于内存的信息),
ICollection
不如调用
Count()
即使迭代器不懒惰,也可能对集合进行迭代。

IListagaints
List
的实际好处是什么?透露太多关于实现的信息有什么错?@extrogorey它直接与封装目标背道而驰。对,这句话听起来像是你在谈论信息来源的机密性。