Я смотрю на Roslyn September 2012 CTP с отражателем, и я заметил следующую глубину первого обход синтаксического дерева:Конкретного использования StrongBox
private IEnumerable<CommonSyntaxNode> DescendantNodesOnly(TextSpan span,
Func<CommonSyntaxNode, bool> descendIntoChildren, bool includeSelf)
{
if (includeSelf && IsInSpan(span, FullSpan))
{
yield return this;
}
if ((descendIntoChildren != null) && !descendIntoChildren(this))
{
yield break;
}
var queue = new Queue<StrongBox<IEnumerator<CommonSyntaxNode>>>();
var stack = new Stack<StrongBox<IEnumerator<CommonSyntaxNode>>>();
stack.Push(new StrongBox<IEnumerator<CommonSyntaxNode>>(ChildNodes().GetEnumerator()));
while (stack.Count > 0)
{
var enumerator = stack.Peek();
StrongBox<IEnumerator<CommonSyntaxNode>> childEnumerator;
if (enumerator.Value.MoveNext())
{
var current = enumerator.Value.Current;
if (IsInSpan(span, current.FullSpan))
{
yield return current;
if ((descendIntoChildren == null) || descendIntoChildren(current))
{
childEnumerator = queue.Count == 0
? new StrongBox<IEnumerator<CommonSyntaxNode>>()
: queue.Dequeue();
childEnumerator.Value = current.ChildNodes().GetEnumerator();
stack.Push(childEnumerator);
}
}
}
else
{
childEnumerator = stack.Pop();
childEnumerator.Value = null;
queue.Enqueue(childEnumerator);
}
}
}
Я предполагаю, что очередь для облегчения выполнения от выделяя и освобождая так много экземпляров IEnumerator<CommonSyntaxNode>
.
Однако я не уверен, почему IEnumerator<CommonSyntaxNode>
завернут в StrongBox<>
. Какие компромиссы производительности и безопасности связаны с упаковкой IEnumerator<CommonSyntaxNode>
, которая обычно является типом значений, внутри ссылочного типа StrongBox<>
?
Я не вижу, как использование StrongBox делает разницу, поскольку вам все равно нужно нажать и поместить каждый экземпляр StrongBox из конца стека, когда он изменится. – cubetwo1729