簡體   English   中英

收益率怪異行為

[英]yield return weird behavior

我有以下代碼:

virtual public IEnumerable<string> GetSelectedIds(){
   if (_kids == null)
        yield return null;
   foreach (var current in _kids.Nodes)
        yield return current;
}

如果_kids == null_kids == null代碼在_kids.Nodes崩潰, _kids.Nodes帶有NullPointerException

我希望如果_kids == null ,則此方法將在前提條件級別返回,但事實並非如此!

為什么方法開頭的前提沒有效果?

嘗試這個:

virtual public IEnumerable<string> GetSelectedIds(){
   if (_kids == null){
      yield return null;
      yield break;
   }
   foreach (var current in _kids.Nodes)
      yield return current;
}

更改

if (_kids == null)
        yield return null;

if (_kids == null)
        yield break;

這將返回一個空序列,用戶將不必檢查返回值。

或者你可以重寫為

public IEnumerable<string> GetSelectedIds(){
   if (_kids == null)
        return null;

   return GetSelectedIds2();
}

private IEnumerable<string> GetSelectedIds2()
{
    foreach (var current in _kids.Nodes)
        yield return current;
}

您的yield return null幾乎可以肯定不是您想要的-它不會停止迭代的運行(您已經發現),並且您可能始終不想將null字符串返回到集合中。

只需將其替換為產量中斷即可。 這樣,您將獲得一個空集合。

將該foreach或包裝在if(_kids != null) ,這可能更加清楚。

至於為什么前提條件不會停止執行-這就是yield return工作的方式-想象一個像這樣的方法:

IEnumerable<String> GetStrings()
{
   yield return "MyFirstString";
   yield return "MySecondString";
   yield return "MyThirdString";
}

這將返回三個字符串的集合-即它不會在第一個yield return之后停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM