Roslyn September 2012 CTP with Reflector を見ていると、SlidingTextWindow クラスに次のものが含まれていることに気付きました。
internal sealed class SlidingTextWindow : IDisposable
{
private static readonly ConcurrentQueue<char[]> arrayPool = new ConcurrentQueue<char[]>();
private int basis;
private readonly LexerBaseCache cache;
private char[] characterWindow;
private int characterWindowCount;
private int characterWindowStart;
private int offset;
private readonly IText text;
private readonly int textEnd;
public SlidingTextWindow(IText text, LexerBaseCache cache)
{
this.text = text;
this.basis = 0;
this.characterWindowStart = 0;
this.offset = 0;
this.textEnd = text.Length;
this.cache = cache;
if (!arrayPool.TryDequeue(out this.characterWindow))
{
this.characterWindow = new char[2048];
}
}
public void Dispose()
{
arrayPool.Enqueue(this.characterWindow);
this.characterWindow = null;
}
// ...
}
このクラスの目的は、 を使用して、入力テキストの部分文字列にすばやくアクセスできるようにすることだと思いchar[] characterWindow
ますcharacterWindow
。これは、Eric Lippertが彼のブログで示しているように、文字列よりも文字配列の部分文字列を取得する方が高速であるためだと思います。
SlidingTextWindow
クラスがインスタンス化されるたびに、クラスLexer
がインスタンス化されます。これは、 への呼び出しごとに発生しSyntaxTree.ParseText
ます。
arrayPool
フィールドの目的がわかりません。このクラスでの唯一の使用法は、コンストラクターと Dispose メソッドです。を呼び出すと、クラスと作成されたクラスSyntaxTree.ParseText
のインスタンスが 1 つしかないように見えます。インスタンスが破棄されたときに をキューに入れ、インスタンスが作成されたときに をデキューしようとすると、どのような利点がありますか?Lexer
SlidingTextWindow
characterWindow
characterWindow
おそらく、Roslyn チームの誰かがこれを理解するのを手伝ってくれるでしょうか?