当前位置: 首页 > 编程语言 > C#

当内容具有条件属性时,C#编译器是否优化foreach块?分享

时间:2023-04-10 21:16:03 C#

C#编译器在foreach块的内容有Conditional属性的情况下会优化吗?我正在编写一些调试代码,我想知道我在做什么可能会损害性能。让我们看一下代码:foreach(variteminaCollection)Debug.WriteLine(item.Name);我知道Debug类使用Conditional属性来避免在发布模式(或DEBUG未定义时)进行编译,但是在发布模式下,这最终会成为一个无用/空的可迭代对象,还是会被编译器优化掉?C#编译器不优化枚举,因为枚举集合的行为可能会产生副作用:在数组的情况下,索引到数组的行为意味着副作用(并且C#编译器重写数组上的foreach循环以获得索引循环)。对于其他集合,GetEnumerator()和MoveNext()隐含副作用。在这两种情况下,潜在的空引用都是副作用。调用[Conditional]方法时,编译代码中仅省略方法调用及其形式参数。请注意,即使是具有副作用的参数也被省略了。但是,没有省略周围的代码。我自己的测试表明,即使添加显式null检查也不会欺骗C#编译器优化枚举,即使对于简单数组也是如此。枚举代??码是否经过JIT编译器优化是另一个问题。它可能,如果它能证明集合总是非空的并且没有其他有意义的副作用。JIT可能已经足够复杂,可以为数组执行此操作;不过,我不会打赌。如果您担心增加的开销,请按照@pid的建议将枚举代码放在#if区域。您在这里没有使用任何编译器符号。将它包装在这些里面:#ifDEBUG//你的代码在这里#endif这种方法的优点:foreach不会被擦除。编译后的代码如下所示:foreach(variteminaCollection){;无论如何都会枚举集合。以上是C#学习教程:当C#编译器的内容有Conditional属性时,是否优化了foreach块?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: