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