vs做asp网站流程,网站设计与管理,青山做网站,重庆做网站建设哪里好咨询区 Polaris878我在遍历集合时#xff0c;经常会遇到集合为 null 的情况#xff0c;比如下面这样#xff1a;int[] returnArray Do.Something(...);拿到数组后#xff0c;接下来我用下面的方式进行遍历。foreach (int i in returnArray)
{// do some more stuff
}说实话… 咨询区 Polaris878我在遍历集合时经常会遇到集合为 null 的情况比如下面这样int[] returnArray Do.Something(...);拿到数组后接下来我用下面的方式进行遍历。foreach (int i in returnArray)
{// do some more stuff
}说实话我非常好奇为什么就不能在 null 集合中进行迭代呢我觉得从逻辑上来说null集合意味着没有迭代项而已但框架却抛出了 NullReferenceException 异常真的难以理解。真的很让我苦恼每次在调用 api 的时候我也不清楚对方确切返回值只能每次都用 if (someCollection ! null) 做一个前置判断。回答区 Reed Copsey首先你要明白 空集合 和 null 有着本质的区别foreach 在内部调用的是 IEnumerable 的 GetEnumerator() 方法而 null 哪里有呢自然就会引发 NullReferenceException 异常不是吗要想解决方法也挺多的大概有如下几种。Enumerable.EmptyT()Empty()扩展方法的内部是一个 EmptyPartition 类它的 MoveNext() 直接返回 false是空集合的绝佳替代方案源码如下internal sealed class EmptyPartitionTElement
{public bool MoveNext(){return false;}
}在使用上非常推荐封装为一个扩展方法。public static IEnumerableT AsNotNullT(this IEnumerableT original)
{return original ?? Enumerable.EmptyT();
}foreach (int i in returnArray.AsNotNull())
{// do some more stuff
}使用 ?. 可空运算符空检查操作符 ?. 也是一个非常好的方式,参考如下代码//fragments is a list which can be nullfragments?.ForEach((obj) {//do something with obj});封装 action可以将 foreach 中的迭代逻辑封装到 action 中并在扩展方法上做防御性检查即可参考如下代码public static class Extensions
{public static void ForEachWithNullT(this IEnumerableT source, ActionT action){if(source null){return;}foreach(var item in source){action(item);}}
}点评区 这确实是一个很搞的问题相信很多朋友在项目开发中肯定会遇到设计模式也有类似的 空对象模式大佬提供的这三种方式很不错学习了。