mke*_*y33 14 .net c# arrays list mutability
我最近问某人为什么他更喜欢在IList上返回一个强类型数组.我一直认为,当面对一个具有长寿命的项目时,针对接口的编程是最灵活和最好的方式.所以当他回答时,我很奇怪:
我们通常更喜欢不可变类型而不是可变类型.数组是不可变的.IList不是.
我不完全确定我理解这句话.任何人都可以帮忙澄清一下吗?
感谢您提供的任何帮助.
Jar*_*Par 13
无论是谁,他都是100%错误的话题.数组是非常可变的.这实际上是不返回数组的原因之一.没有办法阻止调用者将数组的元素更改为他们喜欢的任何内容.
Arrray不可变的唯一方法就是它的长度.分配数组后,其长度无法更改.甚至像Array.Resize这样的API也不会实际调整数组大小,它们只是分配一个新的,复制内容并返回新数组(在这种情况下通过引用).
但我同意在许多情况下最好返回不可变数据.主要的一点是,它允许您返回对类的内部集合的引用,而无需执行完整的副本,同时防止调用者弄乱您的内部状态.大多数可变集合都无法做出这样的保证.
Cha*_*ant 10
我认为他可能会认为,因为数组的长度属性是不可变的,然后不知何故,数组比IList 更不可变,或者他使用了错误的单词并且用不可变的方式交换了具体内容.谁知道,但这是一个奇怪的答案.
我认为返回一个List有一些暗示可以修改它或者它可能会改变而返回一个数组并不意味着那么多.
例如,如果你在一个存储库顶部有一个对象模型,并且有一个类似于GetCars()的方法返回了一个List,那么一个初级程序员看到了cars.Add(Car c)......你认为他对于思考是完全疯了吗? cars.Add(new Car())实际上可能会将汽车添加到存储库中?数组本质上更明确.
我认为List的使用更适合于属性,比如Page.Controls.Add
出于几个原因,我更喜欢返回比List更频繁的数组.
习惯.收藏于1.0/1.1 SUCKED
我更喜欢我的方法返回最简单,最轻量级的对象.如果我需要将一个数组创建一个列表,那么它是微不足道的.
它们可以在.net 1.1中使用,如果我需要支持旧版本的运行时,它可以减少重构的表面我可以重用至少一些代码或应用相同的对象模型.
他本可以指出的一点是IList包含Insert,Remove和Add方法,因此可以修改集合本身.另一方面,T []不能添加元素.
我应该补充一点,FxCop建议改为返回ReadOnlyCollection.索引器是只读的,因此您无法更改元素,Add和其他此类方法都会抛出NotSupportedException.
原则上他是对的,但他不知道如何正确地练习它......
我们通常更喜欢不可变类型而不是可变类型.
那是正确的.不可变类型可以更好地使用
数组是不可变的.IList不是.
这是不正确的.这些都不是一成不变的.
如果要返回不可变的集合,请返回a IEnumerable<T>或a ReadOnlyCollection<T>(使用该List<T>.AsReadOnly方法).如果它们本身不是不可变的,那些仍然不能保护它们.虽然您只能从集合中读取,但如果它们允许,您仍然可以更改每个对象中的数据.
此外,您应该考虑要返回的集合的"所有权".如果您只是为了返回它而创建一个数组,那么没有理由不对它进行完全控制.另一方面,如果您正在返回属于该类成员的集合,则应该只允许根据需要对其进行少量访问.