Collection <T>与List <T>在界面上应该使用什么?

v

代码如下所示:

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

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

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

警告3 CA1002:Microsoft.Design:将“ IMyClass.GetList()”中的“列表”更改为使用Collection,ReadOnlyCollection或KeyedCollection

我应该如何解决这个问题?这是什么好的做法?

格雷格·比奇(Greg Beech)

为了回答问题的“为什么”部分,为什么不这样做List<T>,原因是面向未来和API简单。

面向未来

List<T>不能通过子类化而易于扩展;它旨在快速实现内部实现。你会发现它的方法不是虚拟的,因此不能被覆盖,并且没有钩到其Add/ Insert/Remove操作。

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

因此,通过返回,要么可以很容易的子类,如类Collection<T>或接口,例如IList<T>ICollection<T>或者IEnumerable<T>你可以改变你的内部实现是一个不同的集合类型,以满足您的需求,而不破坏消费者的代码,因为它仍然可以为返回他们期望的类型。

API简单性

List<T>包含许多有用的操作,例如BinarySearchSort等等。但是,如果您要公开的是一个集合,则很可能您控制列表的语义,而不是使用者的语义。因此,尽管您的班级内部可能需要这些操作,但班级的使用者不太可能希望(甚至应该)调用它们。

这样,通过提供一个更简单的集合类或接口,可以减少API用户看到的成员数量,并使他们更易于使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

List <List <String >>是Collection <Collection <T >>的实例吗?

复制时,为什么我的Collection <T>与List <T>类工作不同?

我应该在界面上公开Stream <T>吗?

无法转换类型System.Collection.Generic.List <T>

Collection <?>和Collection <T>有什么区别

为什么以及何时继承Collection <T>

什么时候应该在Java中接受Iterable <T> vs.Collection <T>的参数?

为什么Collection <T>不实现Stream <T>?

在Collection上使用iterable <?超级T>

为什么绑定的List <T>使用foreach循环返回空以在剃刀页面上显示值?

如何克隆Collection <T>?

无法将类型“System.Collection.Generic.List<T>”隐式转换为“T”

为什么Collection.toArray(T [])不使用E []代替

addToCollection(T [] a,Collection <T> c)中的类型T是否应该相同?

List <T>或IList <T>

List <T>与IEnumerable <T>

什么时候应该使用列表List <>而不是Collection <>

使用Dapper删除List <T>

收藏<?扩展了T> vs Collection <T>

什么时候应该使用TaskCompletionSource <T>?

什么时候应该使用Lazy <T>?

如何对Collection <T>进行排序?

如何在C#中将System.Collection.IEnumerable转换为List <T>?

就内存而言,T []和List <T>的内部差异是什么?

HashSet <T>和List <T>有什么区别?

为什么ImmutableList <T>的枚举器比List <T>这么慢

为什么 List<T> 声明 GetEnumerator() 和 IEnumerable<T>.GetEnumerator()?

使用Jackson自定义Collection <T>的序列化

Java List <T> T [] toArray(T [] a)实现