2

在许多情况下,代码将接收IEnumerable<T>并希望保留其中包含的项目序列。一种常见的方法是调用ToList它。但是,如果有问题的实现已经是一个不可变的列表,那么调用ToList它会很浪费。

如果我只是在我的代码中传递集合,我可以定义一个扩展方法,它将传递给(实现)IEnumerable<T>的构造函数,除非提供的对象已经实现(在这种情况下,它会简单地返回为 -是)。实现这样一个类并不难。不过,我担心的是,如果我自己实现了这样一个类,而其他需要这样一个类的人也都这样做了,那么每次在使用不同“不可变列表”类的人编写的代码之间传递一个对象时,它就会结束被防御性地复制(变成以前不可变副本的创建者不再认为不可变的形式)。Supercat.ImmutableList<T>Supercat.IImmutableList<out T>Supercat.IImmutableList<T>

因此,我很好奇:是否有任何方法可以实现接近犯罪质量的任何方法,以获取一系列项目的不可变快照,以便所有订阅该方法的对象都能够将彼此的快照识别为不可变清单?例如,如果许多人让他们的不可变类包含一个具有特定名称的函数,该名称不会用于任何其他目的,而是表示不变性,那么使代码与使用相同方法的其他人的代码有效地互操作将相当容易(使用静态泛型类和反射)。我可以想象很多可能的方法,但我不知道有任何接近临界质量的方法。我更喜欢可以从源代码构建的公共领域,

4

1 回答 1

0

如果“不可变”是指您不希望原始数据的消费者能够更改值,则可以使用ReadOnlyCollection. 但是,在这种情况下,底层列表仍然是可变的,因此消费者不能保证它不会在其他地方更改。

如果您正在寻找真正不可变的集合,最好的选择可能是使用为 F# 创建的集合。看到这个答案。

于 2012-10-01T23:06:10.337 回答