如果集合为 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
    }
}

如果集合为 null,为什么 foreach 会引发异常

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