分配给 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< > 或列表< >

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,则在对基础集合类型进行更改时,必须更新所有调用方。

> IListList 之间的基本区别在于 IList 是一个接口,其中 List 是类。因此,如果您使用List,您将获得更多内置功能来进行搜索或数据操作。

列表

伊利斯特