I am watching Roslyn September 2012 CTP with Reflector, and I noticed that the ChildSyntaxList structure has the following:
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) { } public SyntaxNodeOrToken Current { get { } } public bool MoveNext() { } public void Reset() { } } 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(); } } }
That is, there is a GetEnumerator
method that returns a structure.
It seems that
However, unlike the BCL List<T>
class, there is a nested EnumeratorImpl
class. Is the purpose of this for
- avoid creating a one-time structure and
- to avoid boxing within explicitly implemented methods
IEnumerable<SyntaxNodeOrToken>.GetEnumerator
and IEnumerable.GetEnumerator
?
Are there any other reasons?
source share