我正在查看带有 Reflector 的Roslyn 2012 年 9 月 CTP,我注意到 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
,一次从 2048 个字符开始(尽管characterWindow
可能会增长)。我相信这是因为获取字符数组的子字符串比获取字符串更快,正如 Eric Lippert似乎在他的博客上指出的那样。
SlidingTextWindow
每次实例化类Lexer
时都会实例化该类,每次调用SyntaxTree.ParseText
.
我不明白该arrayPool
领域的目的。它在此类中的唯一用途是在构造函数和 Dispose 方法中。调用SyntaxTree.ParseText
时,似乎只有一个类的实例Lexer
和创建的类的实例SlidingTextWindow
。通过在处理实例时将其入队并在创建实例时characterWindow
尝试使 a 出队可以获得什么优势?characterWindow
也许罗斯林团队的某个人可以帮助我理解这一点?