gpt4 book ai didi

c# - 为什么要有 Enumerator 结构和 EnumeratorImpl 类?

转载 作者:太空狗 更新时间:2023-10-29 23:58:09 24 4
gpt4 key购买 nike

我正在查看 Roslyn September 2012 CTP使用 Reflector,我注意到 ChildSyntaxList 结构具有以下内容:

public struct ChildSyntaxList : IEnumerable<SyntaxNodeOrToken>
{
private readonly SyntaxNode node;
private readonly int count;

public Enumerator GetEnumerator()
{
return node == null ? new Enumerator() : new Enumerator(node, count);
}

IEnumerator<SyntaxNodeOrToken> IEnumerable<SyntaxNodeOrToken>.GetEnumerator()
{
return node == null
? SpecializedCollections.EmptyEnumerator<SyntaxNodeOrToken>()
: new EnumeratorImpl(node, count);
}

IEnumerator IEnumerable.GetEnumerator()
{
return node == null
? SpecializedCollections.EmptyEnumerator<SyntaxNodeOrToken>()
: new EnumeratorImpl(node, count);
}

public struct Enumerator
{
internal Enumerator(SyntaxNode node, int count)
{
/* logic */
}

public SyntaxNodeOrToken Current { get { /* logic */ } }

public bool MoveNext()
{
/* logic */
}

public void Reset()
{
/* logic */
}
}

private class EnumeratorImpl : IEnumerator<SyntaxNodeOrToken>
{
private Enumerator enumerator;

internal EnumeratorImpl(SyntaxNode node, int count)
{
enumerator = new Enumerator(node, count);
}

public SyntaxNodeOrToken Current { get { return enumerator.Current; } }

object IEnumerator.Current { get { return enumerator.Current; } }

public void Dispose()
{
}

public bool MoveNext()
{
return enumerator.MoveNext();
}

public void Reset()
{
enumerator.Reset();
}
}
}

即有一个GetEnumerator返回结构的方法。

好像是这样

  1. 使用结构体可以提高性能,类似于 BCL List<T>.Enumerator 结构,如前所述in this answer , 而那
  2. 结构没有实现 IDisposable 为了不必担心这样做可能产生的错误,as noted on Eric Lippert's blog .

但是,不同于 BCL List<T> 类,有一个嵌套的 EnumeratorImpl类(class)。这样做的目的是为了

  1. 避免使用一次性结构,并且
  2. 避免在明确实现的 IEnumerable<SyntaxNodeOrToken>.GetEnumerator 中装箱和 IEnumerable.GetEnumerator方法?

还有其他原因吗?

最佳答案

Are there any other reasons?

没有想到。您似乎已经准确地描述了这种相当奇怪的序列模式实现的目的。

我赶紧补充:Roslyn 在复杂性、性能要求和生成的对象数量方面是一个不同寻常的 .NET 应用程序。在用户输入时分析具有数千个文件、数百万行和数千万个字符的程序的编译器必须做一些非常不寻常的事情以确保它不会压倒垃圾收集器。 Roslyn 因此使用池化策略、使用可变值类型和其他非主流做法来帮助实现这些性能目标。我不建议承担与这些实践相关的费用和困难,除非您有经验证据表明这些实践可以缓解严重的性能问题。仅仅因为这段代码是由 C# 编译器团队编写的,并不意味着这是您应该如何编写主流业务对象的黄金标准。

关于c# - 为什么要有 Enumerator 结构和 EnumeratorImpl 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18743572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com