具有收益率回报的方法不是抛出异常

时间:2017-02-10 01:14:06

标签: c#

我在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;
        }
    }
}

1 个答案:

答案 0 :(得分:9)

你有迭代器,在你开始枚举(即消耗)它之前不会执行它。要获得异常,可以在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;
    }
}

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