1

可能重复:
为什么要使用 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; }

有人可以向我解释其中的区别。

4

5 回答 5

2

IList<T>是一个接口。List<T>是具体类型。

如果您想少告诉用户您的内部实现(通常这是您想要避免的),那么您应该使用IList<T>- 因为您可以自由切换到实现该接口的任何东西......这可能是某种适配器或包装器 - 或用于测试的模拟。

我还会考虑您是否真的需要返回列表样式对象,或者 using 是否IEnumerable<T>更适合您的需求(如果您只是遍历该列表)。如果您需要长度和直接索引,我认为您只需要该列表 - 即使这样从 an 创建列表IEnumerable<T>也很容易。

于 2012-05-25T03:05:05.700 回答
2
 public IEnumerable<City.Detail> Details { get; private set; }

这可能是您想要从作为类的接口开始的内容。公开最低限度的必要功能,并且不允许外部类修改成员或集合。

仅在需要时公开附加功能(IList),仅在绝对需要时公开设置器。

于 2012-05-25T03:14:14.930 回答
1

我对此的看法是,返回 IList 使您的方法的调用者能够不知道底层实现。这意味着如果您将方法中的实现更改为也实现 IList 的另一个集合,则无需更新任何调用者。然而,如果您返回一个具体的列表,则如果您对基础集合类型进行更改,则必须更新所有调用者。

于 2012-05-25T03:04:12.713 回答
1

出于信息隐藏和可测试性的原因,使用接口而不是类绝对是正确的方法。我什至会走得更远,如果可以的话,建议使用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以后使用 a,您可以将其换掉,而不必担心破坏使用您的类的代码中的某些内容。

于 2012-05-25T03:12:31.170 回答
1

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

列表

列表

于 2012-05-25T03:15:03.173 回答