空传播操作符和foreach
读了很多关于空传播操作符?.
,我发现没有答案,它是否有助于在以下情况。
抛出的代码:
int[] values = null;
foreach ( var i in values ) // Throws since values is null.
{
// ...
}
为了使这个工作,我必须在访问values
变量之前添加一个null
检查。
上述代码很可能超出了空传播运算符的设计考虑范围。 不过,可以肯定的是,我不得不问。
我的问题:
试图访问的时候是空的传播经营者有帮助null
的藏品foreach
循环?
不它不是。 它旨在允许以安全的方式访问对象的成员。 在这种情况下,你必须检查数组是否为空。
我找到了另一种工作方式:
当使用Jon Skeet的(等)奇妙MoreLinq扩展时,有一个ForEach
扩展方法,我可以在我的初始示例中使用它,如:
int[] values = null;
values?.ForEach(i=> /*...*/); // Does not throw, even values is null.
你会如何使用它?
您提供的代码:
int[] values = null;
foreach (var i in values)
{
// ...
}
扩展到某种东西:
int[] values = null;
var enumerator = values.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
var i = enumerator.Current;
// ...
}
}
finally
{
var disposable = enumerator as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
我想你可以写这样的东西:
int[] values = null;
foreach (var i in values?.)
{
// ...
}
编译器必须将其扩展为如下所示:
int[] values = null;
var enumerator = values?.GetEnumerator();
try
{
while (enumerator?.MoveNext() ?? false)
{
var i = enumerator.Current;
// ...
}
}
finally
{
var disposable = enumerator as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
并且记住:
a = b?.M();
扩展为:
a = b == null ? null : b.M();
如果你不想明确地写if
语句,你总是可以依靠良好的旧的空合并运算符(??):
int[] values = null;
foreach (var i in values ?? Enumerable.Empty<int>())
{
// ...
}
链接地址: http://www.djcxy.com/p/13057.html