Def*_*Day 44 .net c# ienumerable object
在null对象上调用Any()时,它会在C#中抛出ArgumentNullException.如果对象为null,那么肯定没有'any',它应该返回false.
为什么C#以这种方式运行?
Cod*_*aos 130
Any() 问:"这个盒子包含任何物品吗?"
如果框是空的,答案显然是否定的.
但如果首先没有盒子,那么这个问题没有意义,而且这个功能抱怨道:"你到底在说什么?没有盒子."
Jon*_*Jon 39
处理引用类型时,null值在语义上与"空"值不同.
甲null串是不一样的string.Empty,并且null IEnumerable<T>是不一样的 Enumerable.Empty<T>(或任何其他"空"可枚举该类型的).
如果Any不是扩展方法,则调用它将null导致NullReferenceException.因为它是一个扩展方法,抛出一些异常(虽然没有必要)是一个好主意,因为它保留了试图调用方法的众所周知的语义null:BOOM!
Jax*_*ian 36
使用现代C#,您可以通过如下简单检查轻松处理OP的场景:
List<string> foo = null;
if (foo?.Any() ?? false)
{
DoStuff();
}
Run Code Online (Sandbox Code Playgroud)
这有点像AnyOrDefault(bool default)OP期望Any()扩展方法做的蹩脚实现.
您可以轻松地将其转换为这样的扩展:
public static bool HasItems<T>(this IEnumerable<T> source)
{
return (source?.Any() ?? false);
}
Run Code Online (Sandbox Code Playgroud)
老实说,我真的不喜欢这个名字AnyOrDefault,因为传递一个默认值是没有意义的(默认值为true可能对以后阅读代码的人来说非常有意义).
Any()是一个扩展方法,所以this实际上是作为第一个参数传递给方法的。在这种情况下,它抛出ArgumentNullExceptionisthis是可以理解的null。
您可以事先自行检查:
bool hasAny = yourData == null ? false : yourData.Any(yourPredicate);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33994 次 |
| 最近记录: |