使用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,因此您需要在整个循环或 if (text.IsNullOrWhitespace()) { throw new ArgumentNullException(nameof(text)); } // while loop here or text.SomeLinqCodeHere() 这里有一些代码行并不是真的没必要,添加一些没有实际价值的熵.在简单的foreach的情况下,它确实是基于意见的关于代码标准的决定,但是这个功能的真正目的是将其与C#7中的其他新东西联系起来,如 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循环的性能,正如已经说过的那样,它不会受到影响,因为枚举器只出现一次,并且在真正的循环之前. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |