是`cond? true:false`一直很好的语法?

时间:2017-02-08 21:44:25

标签: javascript c#

开始一份新工作,我的同事的代码在他们的C#和Javascript代码中充斥着cond ? true : false个表达式。我倾向于用cond替换所有这些事件。但是代码没有足够的回归测试在重构时太过于令人难以置信的大胆,所以我很谨慎。我甚至在我们使用的Javascript库中注意到了这种模式,这让我想知道这是不是很好的语法。在我看来,只是看起来有人忘记了bool表达式已经是值,我们不需要剔除bool文字。我非常有信心我可以随时将其从C#代码中删除,但我想知道Javascript条件运算符是否会使用强制?或者,如果有任何其他原因,为什么这种模式有时可以成为好的做法?

4 个答案:

答案 0 :(得分:4)

所有答案都说明cond ? true : false是C#中的冗余代码并不完全正确。有一个鲜为人知的/使用过的语言功能,它实际上是有道理的(尽管这不是你的特殊情况)。

考虑以下类型:

class StrangeWrapper<T>
{
    public T Value { get; }
    public StrangeWrapper(T value) { Value = value; }

    public static bool operator true(StrangeWrapper<T> value)
    {
        return !Equals(value.Value, default(T));
    }

    public static bool operator false(StrangeWrapper<T> value)
    {
        return Equals(value.Value, default(T));
    }
}

现在您可以执行以下操作:

var t = new StrangeWrapper<int>(1);
var f = new StrangeWrapper<string>(null);
var thisWillBeTrue = t ? true : false;
var thisWillBeFalse = f ? true : false;

并不是说我认为这个用例特别有用,但鲜为人知的特征是cond不一定是bool;它可以是任何类型,用于实现truefalse运算符。

答案 1 :(得分:2)

我只能说javascript方面,但是你没有提供关于如何使用cond?true: false的足够信息。换句话说:表达式的布尔值是否设置为变量? - 和其他地方使用的变量?或者表达式仅在if语句中进行评估?

我问,因为javascript是一种无类型语言。

如果cond的每个实例都是布尔值true或false,那么请确保替换它们。

如果cond的任何实例可能是字符串或int,则可能会改变程序的运行方式。

一个简单的例子:

var cond = "helloworld"
var bool = cond?true:false
console.log(bool)

// ^打印bool将打印true

其中:

var cond = "helloworld"
console.log(cond);

// ^其中打印cond将导致字符串helloworld

所以在javascript中,根据使用的方式,用cond替换这些表达式可能不是最佳解决方案。

您可以做的一件事就是将cond?true:false更改为!!cond。它正在做同样的事情,但文本较少。不利的一面是,它并不总能立即清楚你正在做什么。

哪里!是不是运营商和!!实质上返回插补值的布尔值。

答案 2 :(得分:1)

实际上它对c#和js都有价值 对于js,因为它不是类型安全的,这相当于new boolean(cond)

它还使所有非1和true值等于false而不处理Nan和null

在C#中,如果对象是动态类型,则与js

的情况相同

如果它是一个bool,那么你只是避免运行时错误,从我的观点来看这是一个不好的做法

答案 3 :(得分:0)

我相信你已经回答了你的问题。

我同意你的意见,你可以安全地从C#代码中取出它。 ?:运算符只能将布尔值作为其第一个操作数,编译器负责确保它。因此,即使没有足够的测试,我也会对结果充满信心。另一方面,处理cond ? false : true会有点棘手但不多。

JS代码是另一个野兽。您的代码中可能会出现以下情况:

&#13;
&#13;
var cond = 1;
var boolean = cond ? true : false;

// somewhere far from the assignment or not easy to visualize
if (boolean === true) {
  console.log("it was true!");
} else {
  console.log("it was false!");
}
&#13;
&#13;
&#13;

如果盲目地替换三元运算符,其行为会有所不同。

&#13;
&#13;
var cond = 1;
var boolean = cond;

// somewhere far from the assignment or not easy to visualize
if (boolean === true) {
  console.log("it was true!");
} else {
  console.log("it was false!");
}
&#13;
&#13;
&#13;

无论如何,我首先会与团队讨论,并了解使用此构造背后的原因。也许它背后有一个很好的(虽然奇怪的)原因。