分配给 IList< > 或列表< >
本文关键字:列表 分配 IList | 更新日期: 2023-09-27 18:35:21
可能的重复项:
为什么使用 IList 或 List?
我有以下几点:
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; }
}
作为创建细节的一种方式的建议给了我。我不确定的是为什么以下行被声明为 IList:
public IList<City.Detail> Details { get; set; }
将其声明为:
public List<City.Detail> Details { get; set; }
有人可以向我解释其中的区别吗?
IList<T>
是一个接口。 List<T>
是混凝土类型。
如果你想告诉用户更少的关于你的内部实现的信息(通常是你想要避免的),那么你应该使用IList<T>
- 因为你可以自由切换到实现该接口的任何内容......这可能是某种适配器或包装器 - 或用于测试的模拟。
我还会考虑您是否真的需要返回列表样式对象,或者使用 IEnumerable<T>
是否更适合您的需求(如果您只是遍历该列表)。我认为,只有当您需要长度和直接索引时,您才需要列表 - 即使这样,从IEnumerable<T>
创建列表也很容易。
public IEnumerable<City.Detail> Details { get; private set; }
这可能是您想要从中作为类的界面开始的。 公开最低限度的必要功能,并且不允许外部类修改成员或集合。
仅在需要时公开附加功能 (IList),并且仅在绝对需要时才公开资源库。
出于信息隐藏和可测试性的原因,使用接口而不是类绝对是正确的方法。我什至会更进一步,如果可以的话,建议使用 ICollection<T>
而不是 IList<T>
:这将在选择替代实现方面为您提供更大的灵活性,同时让您的用户执行几乎相同的操作。
可能不会为它使用自动可分配属性:我将返回一个只读版本,并提供单独的方法来操作我自己的类上的列表。
这是我要做的:
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();
}
}
}
这会向用户隐藏列表的实现,不允许他们在您背后修改列表,甚至不会告诉他们您正在使用List
。如果你决定在以后的某个日期使用一个HashSet
,你可以把它换进去,而不必担心破坏使用你的类的代码中的某些东西。
我对此的看法是,返回 IList 使方法的调用方与底层实现无关。这意味着,如果将方法中的实现更改为也实现 IList 的另一个集合,则无需更新任何调用方。而如果返回具体的 List,则在对基础集合类型进行更改时,必须更新所有调用方。
> IList
和 List
之间的基本区别在于 IList 是一个接口,其中 List 是类。因此,如果您使用List,您将获得更多内置功能来进行搜索或数据操作。
列表
伊利斯特