所以我经常遇到这种情况……Do.Something(…)返回一个空集合,如下所示:

int[] returnArray = Do.Something(...);

然后,我尝试像这样使用这个集合:

foreach (int i in returnArray)
{
    // do some more stuff
}

我只是好奇,为什么foreach循环不能操作一个空集合?在我看来,零次迭代将被一个空集合执行是合乎逻辑的……相反,它抛出一个NullReferenceException。有人知道为什么吗?

这很烦人,因为我使用的api不清楚它们返回什么,所以我最终到处都是if (someCollection != null)。


当前回答

因为空集合和空集合不是一回事。空集合是没有元素的集合对象;空集合是一个不存在的对象。

这里有一些可以尝试的方法:声明两个任意类型的集合。通常初始化一个,使其为空,并将另一个赋值为null。然后尝试向两个集合添加一个对象,看看会发生什么。

其他回答

SPListItem item;
DataRow dr = datatable.NewRow();

dr["ID"] = (!Object.Equals(item["ID"], null)) ? item["ID"].ToString() : string.Empty;

只要写一个扩展方法来帮助你:

public static class Extensions
{
   public static void ForEachWithNull<T>(this IEnumerable<T> source, Action<T> action)
   {
      if(source == null)
      {
         return;
      }

      foreach(var item in source)
      {
         action(item);
      }
   }
}

foreach循环调用GetEnumerator方法。 如果集合为空,此方法调用将导致NullReferenceException。

返回一个空集合是不好的做法;你的方法应该返回一个空的集合。

它被回答了很长时间,但我已经尝试以以下方式这样做,以避免空指针异常,可能对使用c#空检查操作符的人有用。

     //fragments is a list which can be null
     fragments?.ForEach((obj) =>
        {
            //do something with obj
        });

因为空集合和空集合不是一回事。空集合是没有元素的集合对象;空集合是一个不存在的对象。

这里有一些可以尝试的方法:声明两个任意类型的集合。通常初始化一个,使其为空,并将另一个赋值为null。然后尝试向两个集合添加一个对象,看看会发生什么。