空传播操作符和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

上一篇: Null propagation operator and foreach

下一篇: What does the Visual Studio "Any CPU" target mean?