我正在查看带有 Reflector 的Roslyn 2012 年 9 月 CTP,我注意到 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
返回结构的方法。
看起来像这样
- 使用结构是类似于 BCL
List<T>.Enumerator
结构的性能增益,如本答案所述,并且 - 如 Eric Lippert 的博客所述,该结构没有实现
IDisposable
,因此不必担心这样做可能会产生错误。
但是,与 BCLList<T>
类不同的是,它有一个嵌套EnumeratorImpl
类。这是为了
- 避免使用一次性结构,并且
- 避免在显式实现
IEnumerable<SyntaxNodeOrToken>.GetEnumerator
和IEnumerable.GetEnumerator
方法中装箱?
还有其他原因吗?