如果集合为 null,为什么 foreach 会引发异常
本文关键字:异常 foreach 为什么 集合 null 如果 | 更新日期: 2023-09-27 18:32:34
我问当您尝试使用 foreach 循环迭代的对象为 null 时引发异常的原因是什么?
例如,以下代码引发异常:
public void Test()
{
IEnumerable<int> numbers = null;
foreach (var number in numbers)
{
//Do stuff
}
}
现在修复很容易,只需在 foreach 循环之前检查 null 即可。
public void Test()
{
IEnumerable<int> numbers = null;
if (numbers != null)
{
foreach (var number in numbers)
{
//Do stuff
}
}
}
我的想法是,你可以用foreach循环做的所有事情,你都可以用一个常规的for循环来做,因此foreach循环基本上存在,因为它写起来更方便,更容易阅读。重要的部分是写起来更方便。如果创建某些东西是为了方便,为什么不一路走下去,在这种情况下隐式执行 null 检查。现在可能在某些情况下,如果集合为 null,您实际上希望抛出异常,但是,我觉得到目前为止,这些是少数,它们应该是您需要显式并检查 null 的情况。如下所示:
public static void Test()
{
IEnumerable<int> numbers = null;
if (numbers == null)
throw new NullReferenceException();
foreach (var number in numbers)
{
//Do stuff
}
}
IMO,在这种情况下抛出异常是一件好事。否则,您可能会忘记初始化IEnumerable
并运行代码,就好像一切都很好(实际上它并没有像您想要的那样迭代您的列表)。在大多数程序中,这个错误很快就会变得明显,但最好是让你的程序崩溃,而不是冒着它悄无声息地出现故障的风险。
例如,假设以下代码管理距离您居住地三英里的核电站:
while (true)
{
List<string> coresThatAreOverheating = getOverheatingCores();
foreach (string thisCore in coresThatAreOverheating)
{
coolCoreDown(thisCore);
}
}
现在考虑getOverheatingCores()
中是否存在导致它偶尔返回null
的错误。根据我倾向于在foreach
上抛出异常,您很可能会在软件开发过程中发现这一点。在你喜欢默默地把null
当作一个空清单的情况下,你会发现当核崩溃时。不了解你,但我知道我更喜欢哪一个:)
No.. a foreach
变成了一个枚举器.. 本质上,numbers
上的foreach
是这样做的:
var enumerator = numbers.GetEnumerator();
..与任何其他调用一样,对null
引用的方法调用会引发NullReferenceException
。