【问题标题】:What is the advantage of return ICollection over List [duplicate]return ICollection 比 List 有什么优势[重复]
【发布时间】:2012-09-03 02:18:08
【问题描述】:

可能重复:
What is the difference between List (of T) and Collection(of T)?

我有一个静态类和一个 getter 来返回我的列表集合。现在我阅读并被告知要返回 ICollection 而不是 List。与 public static List 相比,使用 public static 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);
        }
    }
}

}

【问题讨论】:

  • @Gary.S - 链接的问题是指Collection and List` 具体类之间的区别。我不认为这个问题是重复的。

标签: c# icollection


【解决方案1】:
  • IEnumerable&lt;T&gt; 提供对一系列 T 对象上的仅向前游标的访问
  • ICollection&lt;T&gt; 提供与 IEnumerable&lt;T&gt; 相同的属性,但也提供 Count 属性(意味着集合具有确定的结束)
  • IList&lt;T&gt; 提供与 ICollection&lt;T&gt; 相同的功能,但还可以通过索引器随机访问列表中的任何元素 (list[5])

List&lt;T&gt; 实现了上述所有功能。

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

【讨论】:

  • 感谢您让它如此易于理解!
  • 好的,谢谢。真的很有帮助。
  • 此外,IList 提供了添加和删除项目的方法,允许客户端更改底层列表对象中的项目。
  • @Parag ICollection 还允许添加和删除它的元素。
【解决方案2】:

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

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

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

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

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&lt;Name&gt;,您无需更改任何使用代码即可执行此操作——只要您支持Name 类的原始接口,您就可以添加额外功能而不会破坏任何内容。

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

【讨论】:

  • @SylviaRosemond 欢迎您。 :)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2012-12-24
    相关资源
    最近更新 更多