能否对条件值使用switch语句?如何优化JToken相关switch代码?
嘿,这个问题我太熟了——既然property本身已经是JToken类型,完全没必要在每个switch case里重复捕获JToken token,这就给你几个简化方案,从优化现有代码到更清爽的替代写法都有:
优化现有Switch语句
我们可以直接用原变量property做判断,用丢弃变量_省略不必要的捕获,代码瞬间清爽很多:
switch (property) { case _ when Schemas.IsNumericProperty(property): return property.ToObject<int>(); case _ when Schemas.IsStringProperty(property): return property.ToObject<string>(); case _ when Schemas.IsCollectionProperty(property): return property.ToObject<string[]>(); case _ when Schemas.IsDependencyProperty(property): return property.ToObject<KeyValue[]>(); default: return property.ToObject<object>(); }
这种写法保留了switch的结构,但去掉了冗余的变量声明,逻辑和原来完全一致。
改用更简洁的if-else链(推荐)
正如你提到的,if链在这种场景下往往更直观高效,没有switch的语法糖开销,代码也更紧凑:
if (Schemas.IsNumericProperty(property)) return property.ToObject<int>(); if (Schemas.IsStringProperty(property)) return property.ToObject<string>(); if (Schemas.IsCollectionProperty(property)) return property.ToObject<string[]>(); if (Schemas.IsDependencyProperty(property)) return property.ToObject<KeyValue[]>(); return property.ToObject<object>();
每个条件判断后直接返回,逻辑一目了然,读起来比switch舒服很多,性能也和手写分支判断几乎一致。
可扩展的字典映射方案
如果以后你需要频繁新增属性类型判断,用字典把“检查逻辑”和“转换逻辑”绑定起来会更易维护:
// 建议把这个字典定义为类的静态成员,避免每次调用都创建实例 private static readonly Dictionary<Func<JToken, bool>, Func<JToken, object>> _propertyConverters = new() { { Schemas.IsNumericProperty, token => token.ToObject<int>() }, { Schemas.IsStringProperty, token => token.ToObject<string>() }, { Schemas.IsCollectionProperty, token => token.ToObject<string[]>() }, { Schemas.IsDependencyProperty, token => token.ToObject<KeyValue[]>() } }; // 调用逻辑 foreach (var converter in _propertyConverters) { if (converter.Key(property)) return converter.Value(property); } return property.ToObject<object>();
以后新增类型只需要在字典里加一行,不需要修改分支逻辑,不过要注意:C# 7.0及以上的字典是保持插入顺序的,如果你需要严格的判断优先级,要确保字典的插入顺序和你想要的判断顺序一致。
总结
- 追求最简最直观:选if-else链,代码量最少,可读性最高;
- 想保留switch结构:用优化后的switch版本;
- 考虑未来扩展性:用字典映射方案。
内容的提问来源于stack exchange,提问作者Tristan Trainer
相关产品推荐
相关产品推荐

