Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NET中的不可变列表:为什么允许添加和删除项?_Java_C#_List_Immutability - Fatal编程技术网

Java NET中的不可变列表:为什么允许添加和删除项?

Java NET中的不可变列表:为什么允许添加和删除项?,java,c#,list,immutability,Java,C#,List,Immutability,在C#中,我需要一个不可变列表,这意味着列表不能更改 与Java的不可变列表非常相似: 从那里: 如果试图在列表中添加空元素, 抛出UnsupportedOperationException 现在,在.NET中(至少在Core2.2中),也有一个不可变的列表,记录在案 他们说(强调我的): 在不可变列表中添加或删除项时 原始列表包含添加或删除的项,以及 原来的名单没有改变 因此,这个实现基本上允许更改列表(每次都得到一个经过处理的副本),这与java理解相反,而且,它大部分都不会阻塞内存 拥有一

在C#中,我需要一个不可变列表,这意味着列表不能更改

与Java的不可变列表非常相似:

从那里:

如果试图在列表中添加空元素, 抛出UnsupportedOperationException

现在,在.NET中(至少在Core2.2中),也有一个不可变的列表,记录在案

他们说(强调我的):

在不可变列表中添加或删除项时 原始列表包含添加或删除的项,以及 原来的名单没有改变

因此,这个实现基本上允许更改列表(每次都得到一个经过处理的副本),这与java理解相反,而且,它大部分都不会阻塞内存

拥有一个支持添加和删除方法的不可变列表有什么意义?

对我来说,这里的问题是,我的代码的用户可能会得到一个不可变的列表,但出于疏忽,他们会很高兴地添加项目,而这些项目永远不会进入原始的“存储库”。这会引起混乱

我想(唯一的)方法是完全禁止操作,并向代码用户说明,使用IEnumerale界面?

正如您所说:“原始列表的副本中添加或删除了项目,原始列表保持不变。”

因此,您可以添加/删除元素,并使用更改创建一个新列表。原来的名单没有改变

拥有一个支持添加和删除方法的不可变列表有什么意义

首先想一想:不支持以任何方式添加或删除项的不可变列表有什么意义?没有什么特别有用的。您可以使用数组来实现这一点

现在回到你的问题上来。列表是不可变的,因此使用者不能更改通过其他方法或类提供的实例本身。用户不能更改备份存储!但不可变列表的生产者可以通过创建新的不可变列表并将其分配给原始变量来“改变”后备存储。那不是很有用吗

拥有一个支持添加和删除的不可变列表有什么意义 首先删除方法

除了遵守
列表
契约之外,任何人都不会发现任何不可变的实现将公开每个
列表
方法。
之后,您有两种方法来处理这些修改方法:抛出异常或通过在每次修改时创建并返回一个新列表来保证不变性

关于:

我想唯一的办法是完全禁止操纵, 将使用IEnumerale接口吗

事实上,在Java中,当您希望能够操纵一组内容而无需改变它时,您可以使用
Iterable
(这已经足够接近了)。

作为替代方案,您也可以使用数组

不可变特性应用实例本身,而不是实例包含的数据,因此您当然可以从列表中读取数据并添加新元素,然后从中创建新的不可变列表。IEnumerable允许您执行以下操作:
myIEnumerableCollection.Union(new[]{newItem}).ToList()
这仍然会创建一个新对象,而不会修改原始对象。不变性是实例的属性。如果在修改时选择抛出或复制,则这两种方法都是有效的,不会违反instance@disklosr说得好。我可能最终会使用IEnumerable,因为这是我最关心的:提供一个集合,同时传达用户无法向原始集合添加内容的信息。这样,如果他们需要的话,就由他们自己创建一个副本。是的,我们读过了,但是为什么列表不是从构造函数创建的,而只是从构造函数创建的?@Phillip看一看“…即使不可变也会暴露每个列表方法”几乎确定了“为什么”部分。我在这里很挑剔,但是如果不可变在您的系统中如此重要,您应该使用真正的不可变集合实现。使用IEnumerable或better alternative(imo)IReadOnlyCollection只会隐藏问题,因为没有什么能阻止您回溯到原始类型并对其进行变异。@disklosr我完全同意,更进一步地说,我认为在大多数情况下,不变性很重要,因为它使您的系统更加健壮。只是很多人不习惯使用它,所以不要使用它。。。在C#中是否有真正的不可变类(标准或第三方库)?关于第一点,数组是可变的(除非它是空的),因此它不是不可变列表的替换。您只能通过创建新的数组来扩展数组,对吗@disklosr或者我遗漏了任何关键的东西吗?你不能扩展数组,但你可以替换数组中的元素,这使得它是可变的。这里有一个有趣的阅读:啊,是的。当然这种比较并没有完全上升。