我知道 yield return 利用延迟加载,但我想知道我是否可能滥用迭代器或很可能需要重构。
我的递归迭代器方法返回给定的所有祖先,PageNode
包括它pageNode
本身。
public class PageNodeIterator {
//properties and constructor left out for brevity
public IEnumerable<IPageNode> ancestorsOf(IPageNode pageNode) {
if(pageNode == null) throw new ArgumentNullException(("pageNode"));
if (pageNode.url != pageNodeService.rootUrl) {
yield return pageNode;
if (pageNode.parent != null)
foreach (var node in ancestorsOf(pageNode.parent))
yield return node;
}
}
}
在我对 的调用中ancestorsOf
,我调用了该方法,然后颠倒了返回的顺序IEnumerable
,但是由于加载被延迟,所以调用实际上直到我调用ToArray()
下一行并且pageNodeService
在我的迭代器方法中为 null 和抛出空引用异常。
ancestors = pageNodeIterator.ancestorsOf(currentNode).Reverse();
return ancestors.ToArray()[1].parent.children;
所以,我想知道我哪里出错了。如果有的话,在这种情况下使用迭代器的正确方法是什么?
我也想知道为什么pageNodeService
在执行时为空。即使执行被推迟,它不应该仍然有价值吗?