返回IList<;T>;C#中的vs数组?
我最近问某人为什么他更喜欢返回强类型数组而不是IList。我一直认为,当面对一个寿命较长的项目时,针对接口编程是最灵活和最好的编程方式。所以当他回答时,我觉得很奇怪: 我们通常更喜欢不可变类型 超过可变的。数组是 不变的IList不是 我不完全确定我是否理解这句话。有人能帮我澄清一下吗返回IList<;T>;C#中的vs数组?,c#,.net,arrays,list,mutability,C#,.net,Arrays,List,Mutability,我最近问某人为什么他更喜欢返回强类型数组而不是IList。我一直认为,当面对一个寿命较长的项目时,针对接口编程是最灵活和最好的编程方式。所以当他回答时,我觉得很奇怪: 我们通常更喜欢不可变类型 超过可变的。数组是 不变的IList不是 我不完全确定我是否理解这句话。有人能帮我澄清一下吗 感谢你们提供的帮助。也许这个人不知道他在说什么?基本上,他说的是“我们更喜欢在运行时不容易更改的结构,因为我们相信它们不太容易出错。”在这种情况下这是否正确是另一个问题。我也不明白。数组除了大小之外,非常可变。单
感谢你们提供的帮助。也许这个人不知道他在说什么?基本上,他说的是“我们更喜欢在运行时不容易更改的结构,因为我们相信它们不太容易出错。”在这种情况下这是否正确是另一个问题。我也不明白。数组除了大小之外,非常可变。单个元素仍然可以修改。也许他的意思是数组是值类型,列表是引用类型。我不知道
无论如何,你应该看看这个主题。也可以为您提供一些弹药供讨论。他可能的意思是IList包含插入、删除和添加方法,因此可以修改集合本身。另一方面,T[]不能添加元素
我应该补充一点,FxCop建议返回ReadOnlyCollection。索引器是只读的,因此您不能更改元素,Add和其他类似的方法都抛出NotSupportedException。也许他是说数组的大小是“不可变的”? 基本上,你只需声明一次大小,你就会被卡住。对于列表,您始终可以使用“添加”
我想如果您确定列表的大小,那么数组可能会快一点。IList是可变的,因为您可以添加和删除项,而不仅仅是更改已经存在的项。数组允许您处理单个项,但特定索引永远不会完全无效。选择不变性有很多原因——例如,它使意外数据损坏的表面积小得多。无论“他”是谁,在这个问题上都是100%错误的。数组是非常可变的。这实际上是不返回数组的原因之一。无法阻止调用者将数组的元素更改为他们喜欢的任何内容 Arrray不可变的唯一方式是它的长度。一旦分配了数组,就不能更改其长度。甚至像Array.Resize这样的API实际上也不会调整数组的大小,它们只是分配一个新数组,复制内容并返回新数组(在本例中通过引用)
不过,我确实同意,在许多情况下,最好返回不可变的数据。主要的一点是,它允许您返回对类的内部集合的引用,而无需执行完整的复制,同时防止调用方干扰您的内部状态。大多数可变集合不能做出这样的保证 原则上他是对的,但他不知道如何正确地练习 我们通常更喜欢不可变类型 超过可变的 这是正确的。不可变类型更易于使用 数组是不可变的。IList不是 这是不对的。这两者都不是一成不变的 如果要返回不可变的集合,请返回
IEnumerable
或ReadOnlyCollection
(使用List.AsReadOnly
方法)。尽管如此,如果对象本身不是不可变的,它们仍然不能保护对象。尽管您只能从集合中读取数据,但如果每个对象允许,您仍然可以更改其中的数据
也应该考虑你所返回的集合的“所有权”。如果创建数组的唯一目的是返回它,那么没有理由不完全控制它。另一方面,如果返回的集合是类的成员,则应只允许对其进行所需的访问。
将接口用作返回类型而不是实际类型本身的原因是对调用方隐藏内部实现。这允许实现更改实际类型,而无需重新循环到应用程序的其余部分 将内部使用的集合复制到数组中以供外部使用是没有任何意义的,原因只有可变或不可变 分别是: -是否返回强类型数据的列表。IList或IList。 始终首选使用强类型数据。 -可变的或不变的。ICollection、IList或IEnumerator返回您希望允许的数据。对于只读列表,只返回IEnumerator。如果允许调用方使用ICollection或IList修改集合。我想他可能认为,因为数组的长度属性是不可变的,那么不知何故,数组比IList更不可变,或者他使用了错误的单词,并将具体与不可变交换。谁知道呢,但这是个奇怪的答案 我认为返回一个列表有点暗示修改它是可以的,或者返回数组时它可能会改变,但这并不意味着这么多 例如,如果您在存储库的顶部有一个对象模型,并且有一个类似GetCars()的方法返回一个列表,而初级程序员看到了cars.Add(carc)。。。你会认为他完全疯了,因为他会思考汽车。Add(new Car())实际上可能会将汽车添加到存储库中?数组本质上更显式 我认为在属性中使用列表更合适,比如Page.Controls.Add 出于几个原因,我更喜欢返回数组而不是列表
- 习惯。1.0/1.1版本中的集合失败
- 我更喜欢我的方法返回最简单、最轻量级的对象