返回 ICollection 相对于 List 的优势是什么?

3

可能有重复:
List(T)和Collection(T)之间的区别是什么?

我有一个静态类和一个getter来返回我的List集合。现在我已经阅读并被告知要返回ICollection而不是List。使用public static ICollection优于public static List的优势是什么?

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);
        }
    }
}

}


@Gary.S - 这个链接的问题涉及到CollectionList具体类之间的区别。我认为这个问题不是重复的。 - Richard Szalay
3个回答

3
  • IEnumerable<T>提供了对一系列T对象的单向光标访问。
  • ICollection<T>提供了与IEnumerable<T>相同的功能,但还包括一个Count属性(表示集合具有明确定义的末尾)。
  • IList<T>提供了与ICollection<T>相同的功能,但还可以通过索引器(list[5])随机访问列表中的任何元素。

List<T>实现了上述所有功能。

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


谢谢您让它变得如此易于理解! - Kevin P. Rice
此外,IList 还提供了添加和删除项目的方法,使客户端能够修改底层列表对象中的项目。 - Parag Meshram
@Parag ICollection 还允许添加和删除其元素。 - Richard Szalay

2

使用接口而不是类型,这是一种良好的实践方法,更易于维护。如果您使用接口而不是类型(如List),那么您的代码就不会硬编码到该类型上。

例如:假设您稍后决定将Storage类更改为在另一种类型的存储中持久化数据(即数据库、XML等)。您可以使用Entity Framework连接到数据库,或者使用LINQ-to-objects。

实际上,您可能要考虑使用IEnumerableIEnumerable<string>。这些类型与LINQ以及大多数其他类型的集合非常兼容。因此,您可以在不更改返回类型并重新处理所有处理Storage类的代码的情况下过渡到LINQ。

也许string也不是最佳选择?您要存储什么?也许您应该为正在存储的对象创建一个类(例如Name)。然后,您将返回一个IEnumerable<Name>

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

接下来您可能希望将访问FirstNameLastName添加到您的类中:

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 固定下来时,将使未来的更改更加困难。您可能现在并不了解这一点,但当您成为更好的程序员或需要进行未来更改时,您将看到使用允许更改基础类型的接口的好处。尝试在选择对象类型时预见未来可能性,并在第一次修订中加以适应,这样以后添加东西时就能避免头疼。

0
如果你问为什么要返回接口而不是对象,那么接口描述了对象的功能和使用方式,而不需要特定的实现。这使得代码更加通用。
如果你问为什么要使用集合而不是列表,集合不意味着有序,而列表则是有序的。技术术语是集合比较“弱”,因此适用于更多的情况。如果不需要排序,请使用集合。否则,请使用列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接