C# 分配给IList<&燃气轮机;或列表<>;?
可能重复:C# 分配给IList<&燃气轮机;或列表<>;?,c#,C#,可能重复: 我有以下资料: public class CityViewModel { public CityViewModel() { Details = Enumerable.Range(1,10).Select(x => new City.Detail()).ToList(); } public string Topic { get; set; } public City City { get; set; } pub
我有以下资料:
public class CityViewModel
{
public CityViewModel() {
Details = Enumerable.Range(1,10).Select(x => new City.Detail()).ToList();
}
public string Topic { get; set; }
public City City { get; set; }
public IList<City.Detail> Details { get; set; }
}
公共类城市视图模型
{
公共城市视图模型(){
Details=Enumerable.Range(1,10)。选择(x=>newcity.Detail()).ToList();
}
公共字符串主题{get;set;}
公共城市城市{get;set;}
公共IList详细信息{get;set;}
}
这个建议是给我的,作为创造细节的一种方式。我不确定的是,为什么将以下行声明为IList:
public IList<City.Detail> Details { get; set; }
public IList详细信息{get;set;}
将其声明为:
public List<City.Detail> Details { get; set; }
公共列表详细信息{get;set;}
有人能给我解释一下区别吗。我的观点是,返回IList使方法的调用方不知道底层实现。这意味着,如果将方法内部的实现更改为另一个也实现了IList的集合,则不必更新任何调用方。然而,如果您返回一个具体的列表,那么如果您对基础集合类型进行更改,则必须更新所有调用方。我的观点是,返回IList使方法的调用方不知道基础实现。这意味着,如果将方法内部的实现更改为另一个也实现了IList的集合,则不必更新任何调用方。然而,如果您返回一个具体的列表,那么如果您更改基础集合类型,则必须更新所有调用方。
IList
是一个接口<代码>列表是一种具体类型
如果你想少告诉用户你的内部实现(通常这是你想要避免的),那么你应该使用IList
——因为你可以自由地切换到实现该接口的任何东西。。。它可能是某种适配器或包装器,也可能是用于测试的模拟
我也会考虑你是否真的需要返回一个列表样式对象,或者使用<代码> iQueLabe可以更好地满足你的需求(如果你只是重复这个列表)。我认为,只有在需要长度和直接索引的情况下,才需要列表,即使这样,从
IEnumerable
创建列表也很容易。IList
是一个界面<代码>列表是一种具体类型
如果你想少告诉用户你的内部实现(通常这是你想要避免的),那么你应该使用IList
——因为你可以自由地切换到实现该接口的任何东西。。。它可能是某种适配器或包装器,也可能是用于测试的模拟
我也会考虑你是否真的需要返回一个列表样式对象,或者使用<代码> iQueLabe可以更好地满足你的需求(如果你只是重复这个列表)。如果您需要长度和直接索引,我认为您只需要列表-即使这样,从
IEnumerable
创建列表也很容易。使用接口而不是类绝对是正确的方法,无论是出于信息隐藏还是可测试性的原因。如果可以的话,我甚至会更进一步,建议使用ICollection
而不是IList
:这将使您在选择替代实现时更加灵活,同时让您的用户执行大致相同的操作
此外,我可能不会为它使用自动可分配属性:我将返回一个只读版本,并在我自己的类上提供单独的方法来操作列表
下面是我要做的:
public class CityViewModel {
private readonly List<City.Detail> details;
public CityViewModel() {
// Here you assign a List to details
}
public ICollection<City.Detail> Details {
get {
return details.AsReadOnly();
}
}
}
公共类城市视图模型{
私人只读列表详细信息;
公共城市视图模型(){
//在这里,您可以为详细信息分配一个列表
}
公共ICollection详细信息{
得到{
返回详细信息。AsReadOnly();
}
}
}
这对用户隐藏了列表的实现,不允许他们在背后修改列表,甚至不告诉他们您正在使用
列表
。如果您决定在以后的某个日期使用(比如)一个哈希集
,您就可以将它替换进来,而不用担心破坏使用类的代码中的某些内容。出于信息隐藏和可测试性的原因,使用接口而不是类绝对是正确的选择。如果可以的话,我甚至会更进一步,建议使用ICollection
而不是IList
:这将使您在选择替代实现时更加灵活,同时让您的用户执行大致相同的操作
public IEnumerable<City.Detail> Details { get; private set; }
此外,我可能不会为它使用自动可分配属性:我将返回一个只读版本,并在我自己的类上提供单独的方法来操作列表
下面是我要做的:
public class CityViewModel {
private readonly List<City.Detail> details;
public CityViewModel() {
// Here you assign a List to details
}
public ICollection<City.Detail> Details {
get {
return details.AsReadOnly();
}
}
}
公共类城市视图模型{
私人只读列表详细信息;
公共城市视图模型(){
//在这里,您可以为详细信息分配一个列表
}
公共ICollection详细信息{
得到{
返回详细信息。AsReadOnly();
}
}
}
这对用户隐藏了列表的实现,不允许他们在背后修改列表,甚至不告诉他们您正在使用列表
。如果您决定在以后的某个日期使用一个HashSet
,您就可以将其替换,而不用担心破坏使用类的代码中的某些内容。public IEnumerable Details{get;private set;}
public IEnumerable<City.Detail> Details { get; private set; }
这可能是您想要作为类的接口开始的地方。公开最低限度的必要功能,不允许外部类修改成员或集合
仅在需要时公开附加功能(IList),并且仅在绝对需要时公开setter。public IEnumerable Details{get;private set;}
T