当前位置:  开发笔记 > 编程语言 > 正文

集合<T>与List <T>您应该在接口上使用什么?

如何解决《集合<T>与List<T>您应该在接口上使用什么?》经验,为你挑选了2个好方法。

代码如下所示:

namespace Test
{
    public interface IMyClass
    {
        List GetList();
    }

    public class MyClass : IMyClass
    {
        public List GetList()
        {
            return new List();
        }
    }
}

当我运行代码分析时,我得到以下建议.

警告3 CA1002:Microsoft.Design:更改'IMyClass.GetList()'中的'List'以使用Collection,ReadOnlyCollection或KeyedCollection

我应该如何解决这个问题以及这里有什么好的做法?



1> Greg Beech..:

要回答问题的"原因"部分,为什么不这样做List,原因是面向未来和API简单化.

面向未来

List不能通过子类化来轻松扩展; 它旨在快速进行内部实施.你会注意到它上面的方法不是虚拟的,所以不能被覆盖,并且它的Add/ Insert/ Remove操作没有钩子.

这意味着如果您将来需要更改集合的行为(例如,拒绝人们尝试添加的空对象,或者在发生这种情况时执行其他工作,例如更新类状态),则需要更改类型你可以返回一个集合的子集,这将是一个破坏性的接口更改(当然,更改不允许null的事物的语义也可能是一个接口更改,但更新内部类状态的事情不会是).

因此,通过返回可以轻松子类化的类Collection或者诸如的接口IList,ICollection或者IEnumerable您可以将内部实现更改为不同的集合类型以满足您的需求,而不会破坏消费者的代码,因为它仍然可以作为返回他们期待的类型.

API简单

List包含许多有用的操作,例如BinarySearch,Sort等等.但是,如果这是您正在公开的集合,那么很可能您控制列表的语义,而不是消费者.因此,虽然您的班级内部可能需要这些操作,但您班级的消费者不太可能想要(甚至应该)调用它们.

因此,通过提供更简单的集合类或接口,您可以减少API用户看到的成员数量,并使他们更容易使用.


我看到你的第一点,但我不知道我是否同意你的API简单部分.
http://blogs.msdn.com/fxcop/archive/2006/04/27/faq-why-does-donotexposegenericlists-recommend-that-i-expose-collection-lt-t-gt-instead-of-list- lt-t-gt-david-kean.aspx->已死。我们是否有更新的信息?

2> Jon Skeet..:

我个人会声明它返回一个接口而不是一个具体的集合.如果您真的想要列表访问,请使用IList.否则,考虑ICollectionIEnumerable.


@Jon:我知道这已经过时了,但你可以在http://blogs.msdn.com/b/kcwalina/archive/2005/09/26/474010.aspx上评论Krzysztof所说的内容吗?特别是他的评论,"我们建议使用Collection ,ReadOnlyCollection 或KeyedCollection 作为输出和属性,接口IEnumerable ,ICollection ,IList 用于输入.CA1002似乎与Krzysztof的评论一致.我无法想象为什么会推荐具体的集合而不是接口,以及为什么输入/输出之间的区别.
我认为这与歧义有关.`Collection `和`ReadOnlyCollection `都来自`ICollection `(即没有`IReadOnlyCollection `).如果你返回界面,它不明显是哪一个,是否可以修改.无论如何,感谢您的意见.这对我来说是一个很好的理智检查.
@Nelson:很少你想*要求*调用者传入一个不可变列表,但是*return*one是合理的,因此他们知道它肯定是不可变的.虽然不确定其他收藏品.有更多细节会很高兴.
这不是针对特定情况的.显然,通常`ReadOnlyCollection `对输入没有意义.类似地,`IList `作为输入说,"我需要Sort()或IList所具有的其他成员"对输出没有意义.但我的意思是,为什么`ICollection `被推荐作为输入而`Collection `作为输出.为什么*不*使用`ICollection `作为输出也如你所建议的那样?
推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有