C#属性模式是否按从左到右的顺序执行求值?
结论
你修改后的写法是完全安全的,可以放心使用。
求值顺序说明
- C#语言规范明确规定:属性模式中同一层级的属性匹配项严格按照代码书写的从左到右顺序执行求值,同时具备和
&&运算符一致的短路特性:只要前序的任意一个属性匹配失败,后续所有属性匹配逻辑都会直接跳过不会执行。 - 你当前的写法中
CanSeek: true写在Length < 42之前,当Stream不支持寻址(CanSeek为false)时,Length属性的判断逻辑根本不会触发,完全不会出现访问不支持寻址的Stream的Length属性抛出异常的问题,和你原有stream.CanSeek && stream.Length < 42的写法语义100%等价。
关于优化的顾虑
这种从左到右的求值和短路规则是C#语言层面定义的强制语义,编译器的任何优化操作都不会改变这个执行逻辑,不存在优化后出现执行顺序错乱的可能。你在C# Interactive中测试的结果就是规范要求的标准行为,不是实现的偶发特性。
内容的提问来源于stack exchange,提问作者Martini Bianco
相关产品推荐
相关产品推荐

