作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在查看 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
返回结构的方法。
好像是这样
List<T>.Enumerator
结构,如前所述in this answer , 而那IDisposable
为了不必担心这样做可能产生的错误,as noted on Eric Lippert's blog .但是,不同于 BCL List<T>
类,有一个嵌套的 EnumeratorImpl
类(class)。这样做的目的是为了
IEnumerable<SyntaxNodeOrToken>.GetEnumerator
中装箱和 IEnumerable.GetEnumerator
方法?还有其他原因吗?
最佳答案
Are there any other reasons?
没有想到。您似乎已经准确地描述了这种相当奇怪的序列模式实现的目的。
我赶紧补充:Roslyn 在复杂性、性能要求和生成的对象数量方面是一个不同寻常的 .NET 应用程序。在用户输入时分析具有数千个文件、数百万行和数千万个字符的程序的编译器必须做一些非常不寻常的事情以确保它不会压倒垃圾收集器。 Roslyn 因此使用池化策略、使用可变值类型和其他非主流做法来帮助实现这些性能目标。我不建议承担与这些实践相关的费用和困难,除非您有经验证据表明这些实践可以缓解严重的性能问题。仅仅因为这段代码是由 C# 编译器团队编写的,并不意味着这是您应该如何编写主流业务对象的黄金标准。
关于c# - 为什么要有 Enumerator 结构和 EnumeratorImpl 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18743572/
我正在查看 Roslyn September 2012 CTP使用 Reflector,我注意到 ChildSyntaxList 结构具有以下内容: public struct ChildSyntax
我是一名优秀的程序员,十分优秀!