我正在使用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
结构体的性能提升,如在此答案中所述, 以及 - 该结构体不实现
IDisposable
,以免担心可能会出现的错误,如Eric Lippert的博客上所述。
然而,与BCL List<T>
类不同的是,这里有一个嵌套的EnumeratorImpl
类。它的目的是
- 避免使用可处理的结构体,并且
- 避免在明确实现的
IEnumerable<SyntaxNodeOrToken>.GetEnumerator
和IEnumerable.GetEnumerator
方法中进行装箱吗?
还有其他原因吗?