有没有一种方法可以对三元运算进行短路处理?

4

我可以编写代码

if(Model.DecisionReason != null && Model.DecisionReason.Length > 35)
    return Model.DecisionReason.Substring(0, 32) + "...";
else
    return Model.DecisionReason;

如果if语句中使用&&比较符,当Model.DecisionReason为空时,程序将会短路,避免出现异常。但是,如果我这样写:

return (Model.DecisionReason != null && Model.DecisionReason.Length > 35) ?
     Model.DecisionReason.Substring(0, 32) + "..." :
     Model.DecisionReason;

没有短路并且我遇到了异常。有没有办法使其短路,或者我必须要么将长度比较包装在一个针对null的if检查中,要么嵌套三元运算符(不是最易读的?)


1
两个示例在我运行它们时都可以工作。我怀疑你的分析有误 - 我猜想这是一个简化的有问题的代码示例来说明问题,是吗?如果是这样的话 - 就要寻找其他原因了 - 三元运算符与 if 语句的短路方式完全相同。 - Rob Levine
并不是简单地削减,而是从头开始编写。结果发现在真正的代码中我把结果弄反了,所以如果为空值就会短路并尝试截取子字符串。投票决定关闭,因为问题过于局部化。 - yoozer8
1个回答

7

你写的这两个代码示例将具有相同的行为。短路的不是if语句,而只是&&表达式本身的核心组成部分。


1
实际上,if 在某种意义上也会短路,即根据条件的实际结果不评估 thenelse 分支。;-) - C.B.
三元运算符中的布尔部分与if语句中的短路相同,但与if不同的是,真和假条件都不会短路 - 两者都会被执行。 - speciesUnknown
@gburton 微软文档表明这并非如此?https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator - Derrick Moeller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接