【问题标题】:Method having yield return is not throwing exception具有收益返回的方法不会抛出异常
【发布时间】:2017-06-28 05:47:52
【问题描述】:

我在visual studio中有这段代码,当参数为null时不会抛出异常,我不知道为什么!收益回报是否以某种方式弄乱了它?

IEnumerable<string> Method(string s)
{
    if(string == null)
    {
        throw new Exception();
    }

    if(dictionary.TryGetValue(s, out list))
    {
        foreach(string k in list)
        {
            yield return k;
        }
    }
}

【问题讨论】:

    标签: c#


    【解决方案1】:

    你有迭代器,直到你开始枚举(即消费)它才会执行。要获得异常,您可以在 foreach 语句中调用此方法,或使用一些立即执行的 LINQ 运算符(ToList、ToArray、First 等):

    foreach(var s in Method(null))
    // or
    Method(null).ToList();
    

    延伸阅读yield (C# Reference)

    如果你想立即验证参数,那么你应该把这个方法分成两个方法:

    public IEnumerable<string> Method(string s)
    {
        if(s == null)
           throw new ArgumentNullException(nameof(s));
    
        return MethodIterator(s);
    }
    
    private IEnumerable<string> MethodIterator(string s)
    {
        if(dictionary.TryGetValue(s, out list))
        {
            foreach(string k in list)
               yield return k;
        }
    }
    

    在这种情况下,外部方法是简单方法,它将立即执行(因此我们将获得参数检查)。另一个方法仍然是迭代器,它会延迟执行,但它会收到已经验证过的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2021-07-12
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多