C#中GetEnumerator()返回副本还是遍历原数据源?修改会影响原队列吗?
ConcurrentQueue.GetEnumerator 相关问题解答
1. GetEnumerator() 返回的是队列副本还是原数据源?
ConcurrentQueue<T> 的 GetEnumerator() 方法返回的是调用该方法时队列的快照(副本),并非直接遍历原数据源。这意味着:
- 遍历过程中,原队列的新增、删除操作不会同步到当前枚举器的遍历内容中;
- 枚举器的遍历操作不会因原队列的并发修改抛出
InvalidOperationException。
2. 遍历过程中修改元素会同步修改原队列吗?
不会,主要有两个原因:
- 枚举器遍历的是快照副本,即便能修改元素,也只会修改副本内的内容,与原队列无关联;
- 你的代码中元素类型是
string,它是.NET中的不可变类型,list.Current as string = "aaa"这种写法本身无法编译通过——不可变类型的实例一旦创建就无法修改,你只能重新给变量赋值,而非修改原有字符串对象的内容。
额外说明:若想修改原队列中的元素,不能通过枚举器直接操作。ConcurrentQueue 没有提供枚举器修改元素的能力,你需要先将元素出队,修改后再入队,同时要注意处理并发场景下的线程安全问题。
内容的提问来源于stack exchange,提问作者R.P
相关产品推荐
相关产品推荐

