Я знаю, что 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
имеет значение null во время выполнения. Даже выполнение откладывается, не должно ли оно по-прежнему иметь значение?
yield return
, просто не знаю почему. - person bflemi3   schedule 23.07.2013pageNodeService
? Как вы это устанавливаете? Вы когда-нибудь сбрасывали его наnull
? В идеале, не могли бы вы включить короткий, но полный код, демонстрирующий это? - person svick   schedule 23.07.2013