C#属性模式是否具备if语句的短路求值保证?Resharper重构存疑
C#属性模式重构是否保留短路求值的安全行为?
原代码与重构代码
原代码(为避免Lazy对象未初始化时访问Value):
if (_lazyHeightMap.IsValueCreated && _lazyHeightMap.Value is { IsEmpty: false })
Resharper建议的重构后代码:
if (_lazyHeightMap is { IsValueCreated: true, Value.IsEmpty: false })
核心疑问
原代码依赖&&的短路特性:仅当IsValueCreated为true时,才会访问_lazyHeightMap.Value,避免触发Lazy值的创建。但C#官方文档明确说明:
- 逻辑模式的检查顺序未定义,运行时可能先检查右侧嵌套模式
- 属性模式的子模式匹配顺序未指定,匹配失败时可能不会运行所有子模式
那么重构后的模式表达式是否能保证和原代码一致的行为?是否该将此作为Resharper的bug反馈?
结论与分析
是的,这次重构存在行为不一致的风险,应该作为bug反馈。
- 原代码的逻辑是严格安全的:
&&的短路求值确保只有Lazy值已创建时,才会访问Value属性,完全避免了不必要的Lazy初始化。 - 而属性模式的子匹配顺序不受C#规范约束,运行时可能先尝试解析
Value.IsEmpty,这会直接触发Lazy值的创建,完全违背原代码的设计意图——如果Lazy的创建逻辑有副作用、性能开销或依赖特定条件,会导致意外问题。
这种重构破坏了原代码的安全边界,属于错误的建议,需要向JetBrains提交反馈。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

