什么是回报的ICollection的名单上的优势[复制](What is the advantage

2019-09-22 01:47发布

可能重复:
是什么(的T)名单,并集(的T)之间的区别?

我有一个静态类和一个getter返回我的收藏列表。 现在我读和已被告知返回ICollection的,而不是名单。 什么是使用公共静态的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);
        }
    }
}

}

Answer 1:

  • IEnumerable<T>提供了对访问只向前光标放在一系列T对象
  • ICollection<T>提供相同IEnumerable<T>而且一个Count属性(意味着集合具有最终结束)
  • IList<T>提供相同ICollection<T>也通过一个索引随机访问到列表内的任何元素( list[5]

List<T>实现了所有上面的。

使用简单的界面作为一个参数或返回值的好处是,它提供了更多的灵活性,给调用者,可以帮助记录如何对象将被用于(或打算在返回值的情况下使用)。



Answer 2:

这是很好的做法,更容易维护。 如果您使用的接口,而不是一个类型的,然后你的代码是不是硬编码到该类型( List )。

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

其实,你可能要考虑使用IEnumerableIEnumerable<string> 。 这些类型的工作非常将以LINQ以及大多数其他类型的集合。 这样,就可以过渡到LINQ不改变返回值类型和返工所有与您交易的代码的Storage类。

而且,也许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你变得更困难,使未来的变化。 现在,您可能不希望这一权利,但你成为一个更好的程序员或者发现自己进行未来的变化,你会看到使用允许改变基本类型的接口的好处。 尝试当您选择的对象类型,并适应他们在第一次修改,你会节省头痛,当你以后添加的东西来预测未来的可能性。



Answer 3:

如果你问为什么在返回对象的接口,该接口描述了对象呢,它是如何使用的,而不是要求一个具体的实现。 这使得代码更通用。

如果你问为什么一个集合,而不是一个列表,收藏不要,而列表确实意味着一个数量级。 该技术术语是集合是“弱”等适用于更多的情况。 如果不需要排序,使用的集合。 否则,使用列表。



文章来源: What is the advantage of return ICollection over List [duplicate]