开始一份新工作,我的同事的代码在他们的C#和Javascript代码中充斥着cond ? true : false
个表达式。我倾向于用cond
替换所有这些事件。但是代码没有足够的回归测试在重构时太过于令人难以置信的大胆,所以我很谨慎。我甚至在我们使用的Javascript库中注意到了这种模式,这让我想知道这是不是很好的语法。在我看来,只是看起来有人忘记了bool
表达式已经是值,我们不需要剔除bool
文字。我非常有信心我可以随时将其从C#代码中删除,但我想知道Javascript条件运算符是否会使用强制?或者,如果有任何其他原因,为什么这种模式有时可以成为好的做法?
答案 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
;它可以是任何类型,用于实现true
和false
运算符。
答案 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代码是另一个野兽。您的代码中可能会出现以下情况:
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;
如果盲目地替换三元运算符,其行为会有所不同。
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;
无论如何,我首先会与团队讨论,并了解使用此构造背后的原因。也许它背后有一个很好的(虽然奇怪的)原因。