c# - c# 中的 GetEnumerator() 是否返回副本或迭代原始源?

标签 c# .net ienumerable

我有一个简单的 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)没有 setCurrent 上属性,因此您不能以这种方式修改集合 ( Docs )

关于c# - c# 中的 GetEnumerator() 是否返回副本或迭代原始源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75002540/

相关文章:

c# - 检查 url 是否包含 C# 中的某些单词?

c# - 在 C# 中实现 MYSQL 通知系统失败

c# - "InvalidOperationException: IDX20803: Unable to obtain configuration from: ' [PII 被隐藏] '"

c# - .Net Speech.Synthesizer 中的内存泄漏?

c# - 写入文件时出现奇怪的情况

c# - 使用 PerformanceCounters 定位特定驱动器

c# - 如何在 C# 中报告对 .Distinct() 的长调用的进度

.net - VB.NET 排序 IEnumerable 类

c# - 我不能在 .ascx 上使用 IEnumerable() 吗?

c# - 单元测试,确保良好的覆盖率,同时避免不必要的测试