我有一个简单的 GetEnumerator
用法。
private ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
public IEnumerator GetEnumerator()
{
return queue.GetEnumerator();
}
我想更新这个类之外的队列。
所以,我在做:
var list = _queue.GetEnumerator();
while (list.MoveNext())
{
list.Current as string = "aaa";
}
GetEnumerator()
返回队列的副本,还是迭代原始值?
所以在更新的同时,我更新了原来的?
谢谢你:)
最佳答案
这取决于具体的底层实现。
据我所知,大多数内置的 dotnet 容器都使用当前数据,而不是快照。
如果您在迭代集合时修改集合,您可能会遇到异常 - 这是为了防止出现此问题。
ConcurrentQueue<T>
不是这种情况 , 作为 GetEnumerator
方法返回队列内容的快照(从 .Net 4.6 开始 - Docs)
IEnumerator 接口(interface)没有 set
在 Current
上属性,因此您不能以这种方式修改集合 ( Docs )
关于c# - c# 中的 GetEnumerator() 是否返回副本或迭代原始源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75002540/