3

可能重复:
List (of T) 和 Collection(of T) 有什么区别?

我有一个静态类和一个 getter 来返回我的列表集合。现在我阅读并被告知要返回 ICollection 而不是 List。与公共静态列表相比,使用公共静态 ICollection 有什么优势?

static class Storage
{
    private static List<string> store;

    static Storage()
    {
        store = new List<string>();
    }

    public static ICollection<string> getList
    {
        get
        {
            return store.AsReadOnly();
        }
    }

    public static void addString(string add)
    {
        store.Add(add);
    }

    public static void removeString(string remove)
    {
        store.Remove(remove);
    }

    public static void display()
    {
        foreach (String view in store)
        {
            Console.WriteLine(view);
        }
    }
}

}

4

3 回答 3

3
  • IEnumerable<T>提供对一系列T对象上的只进游标的访问
  • ICollection<T>提供与属性相同IEnumerable<T>Count属性(意味着集合具有确定的结束)
  • IList<T>通过索引器 ( )提供对列表中任何元素的相同ICollection<T>但随机访问list[5]

List<T>实现以上所有。

使用更简单的接口作为参数或返回值的好处是它为调用者提供了更大的灵活性,并且可以帮助记录对象将如何使用(或打算在返回值的情况下使用)。

于 2012-09-03T03:30:05.127 回答
2

这是一种很好的做法,并且更易于维护。如果您使用接口而不是类型,那么您的代码不会硬编码为该类型 ( List)。

示例:假设您稍后决定更改您的Storage类以将数据保存在另一种类型的存储中(即数据库、XML 等)。您可能使用实体框架连接到数据库,或者您可能使用 LINQ-to-objects。

实际上,您可能需要考虑使用IEnumerableor IEnumerable<string>。这些类型非常适用于 LINQ 以及大多数其他类型的集合。因此,您可以转换到 LINQ,而无需更改返回类型并重新编写处理您的Storage类的所有代码。

而且,也许string也不是最好的选择?你在储存什么?也许您应该为要存储的对象创建一个类(即Name)。然后你会想要返回一个IEnumerable<Name>.

class Name
{
    public string Name { get; set; }
}

稍后您可能想要添加对您的类的访问FirstName权限LastName

class Name
{
    public string Name
        get
        {
            return string.Format("{0} {1}", FirstName, LastName);
        }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

通过使用IEnumerable<Name>,您不必更改任何使用代码来执行此操作——只要您支持Name类的原始接口,您就可以添加额外的功能而不会破坏任何东西。

现在,如果您迁移到不同的返回类型,您还应该考虑将所有处理的代码也迁移Storage到新类型。当您在代码中的任何地方“烘焙”存储类型时,您List会更加难以进行未来的更改。你现在可能不明白这一点,但是当你成为一个更好的程序员或发现自己在做未来的改变时,你会看到使用允许改变底层类型的接口的好处。当您选择对象类型并在第一个修订版中容纳它们时,请尝试预测未来的可能性,这样您以后添加东西时就不会头疼了。

于 2012-09-03T03:10:39.330 回答
0

如果您要问为什么要在对象上返回接口,则接口描述了对象的作用和使用方式,而不是需要特定的实现。它使代码更通用。

如果您要问为什么是 Collection 而不是 List,则 Collection 并不意味着顺序,而 List 则意味着。技术术语是集合“较弱”,因此适用于更多情况。如果您不需要订购,请使用 Collection。否则,使用列表。

于 2012-09-03T02:20:52.740 回答