加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用C#7的foreach声明中的空合并运算符

发布时间:2020-12-16 10:13:47 所属栏目:百科 来源:网络整理
导读:我在C#7.0中查看 this code示例,我不确定引擎盖下发生了什么以及此循环的性能. foreach (var c in text ?? throw new ArgumentNullException(nameof(text))){ ...} 我的问题: 条件语句是一次还是多次打击(打开 每次迭代)? 新语法看起来不同,这样做有什么好
我在C#7.0中查看 this code示例,我不确定引擎盖下发生了什么以及此循环的性能.

foreach (var c in text ?? throw new ArgumentNullException(nameof(text)))
{
    ...
}

我的问题:

>条件语句是一次还是多次打击(打开
每次迭代)?
>新语法看起来不同,这样做有什么好处?

解决方法

您应该了解foreach内部代码以了解此C#功能. foreach语句中表达式的右侧部分必须实现IEnumerable(< T>)接口,而整个循环在内部是一个简单的while,类似这样:

// here can be NullReferenceException
var en = text.GetEnumerator();
while(en.MoveNext())
{
    var c = en.Current;
    {
        ...
    }
}

正如您所看到的,此代码中有一点可以发生NRE,因此您需要在整个循环或Enumerable extensions class之前检查可枚举,如下所示:

if (text.IsNullOrWhitespace())
{
    throw new ArgumentNullException(nameof(text));
}

// while loop here or text.SomeLinqCodeHere()

这里有一些代码行并不是真的没必要,添加一些没有实际价值的熵.在简单的foreach的情况下,它确实是基于意见的关于代码标准的决定,但是这个功能的真正目的是将其与C#7中的其他新东西联系起来,如?. operator,如下所示:

int? length = customers?.Length ?? throw new ...;
Customer first = customers?[0] ?? throw new ...;  
int? count = customers?[0]?.Orders?.Count() ?? throw new ...;

在这种情况下抛出异常类似于代码行末尾的注释:

int? length = customers?.Length; // should not be null
Customer first = customers?[0]; // should not be null  
int? count = customers?[0]?.Orders?.Count(); // should not be null

但它为您的代码添加了一些严格的类似合同的规则.

至于具有这种表达式的foreach循环的性能,正如已经说过的那样,它不会受到影响,因为枚举器只出现一次,并且在真正的循环之前.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读