Roslyn September 2012 CTP with 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
述べられているように、構造体を使用すると、BCL 構造体と同様のパフォーマンスが向上します。 - Eric Lippert のブログ に記載されているように、構造体は実装しない
IDisposable
ため、そうすることで発生する可能性のあるバグを心配する必要がありません。
ただし、BCLList<T>
クラスとは異なり、ネストされたEnumeratorImpl
クラスがあります。これの目的は
- 使い捨ての構造体を避ける
IEnumerable<SyntaxNodeOrToken>.GetEnumerator
明示的に実装されたandIEnumerable.GetEnumerator
メソッド内でのボックス化を回避しますか?
他に理由はありますか?