C#的null条件运算符允许有用的短路操作: C# null-conditional operator。
导致可能的替代语法:
如果编译器知道RangedUnit是引用类型(而不是值类型),为什么它不能有条件地执行速记语法?
如果refTypeInstance为空,则不执行任何操作。如果refTypeInstance不为空,则执行该语句。
更新(结论):
- 空值条件运算符不能用于赋值语句左侧,因为这会违反赋值表达式树的预期求值逻辑(跳过赋值并完全不执行它)。 - 理想的解决方案是一种新的条件赋值运算符(仅在赋值的左侧不为空时才执行),本质上是“如果不为空一次赋值一行”的一种简化写法。
double? range = (unit as RangedUnit)?.WeaponRange;
很遗憾的是,空条件运算符不能像缩写赋值一样使用,因为它返回一个值(不能在左手赋值中使用):
(unit as RangedUnit)?.PreferredTarget = UnitType.Melee;
导致可能的替代语法:
if (unit is RangedUnit)
{
(unit as RangedUnit).PreferredTarget = UnitType.Melee;
}
如果编译器知道RangedUnit是引用类型(而不是值类型),为什么它不能有条件地执行速记语法?
refTypeInstance?.SomeField = value;
如果refTypeInstance为空,则不执行任何操作。如果refTypeInstance不为空,则执行该语句。
更新(结论):
- 空值条件运算符不能用于赋值语句左侧,因为这会违反赋值表达式树的预期求值逻辑(跳过赋值并完全不执行它)。 - 理想的解决方案是一种新的条件赋值运算符(仅在赋值的左侧不为空时才执行),本质上是“如果不为空一次赋值一行”的一种简化写法。
?.
运算符时,它会成为可读性较差的不良实践。 - Fabio(unit as RangedUnit)?.SetPreferredTarget(UnitType.Melee);
会起作用(如果您使用方法替换属性设置器)。 - Ivan Stoevtry{..}catch(Exception){}
的做法是一样的,往往你会在其他地方发现这个错误。甚至最坏的情况是客户也会注意到它。 - Tim Schmelter