【发布时间】:2010-12-18 07:47:57
【问题描述】:
啊,你不只是喜欢一个好的三元滥用吗? :) 考虑以下表达式:
true ? true : true ? false : false
对于那些现在完全困惑的人,我可以告诉你,这评估为 true。换句话说,它等价于:
true ? true : (true ? false : false)
但这可靠吗?我能确定在某些情况下不会这样吗:
(true ? true : true) ? false : false
有些人可能会说 - 好吧,那就加括号或者干脆不使用它 - 毕竟,众所周知,三元运算符是邪恶的!
确实如此,但在某些情况下,它们实际上是有意义的。对于好奇的人 - 我正在编写通过一系列属性比较两个对象的代码。如果我这样冷写就好了:
obj1.Prop1 != obj2.Prop1 ? obj1.Prop1.CompareTo(obj2.Prop1) :
obj1.Prop2 != obj2.Prop2 ? obj1.Prop2.CompareTo(obj2.Prop2) :
obj1.Prop3 != obj2.Prop3 ? obj1.Prop3.CompareTo(obj2.Prop3) :
obj1.Prop4.CompareTo(obj2.Prop4)
简洁明了。但它确实取决于在第一种情况下工作的三元运算符关联性。括号只会把它做成意大利面。
那么 - 这是在任何地方指定的吗?没找到。
【问题讨论】:
-
你确定你的代码符合你的意思吗?例如。如果 obj1.Prop1 != obj2.Prop1 但 obj1.Prop1.CompareTo(obj2.Prop1) == 0,您的代码将产生 0 而不是继续检查 Prop2。是有意的吗?
-
仅仅因为你喜欢它的外观并不能使它正确,当然也不能使它具有可读性.. 任何其他查看该代码的人都必须至少在心理上添加括号,所以为什么不帮大家一个忙,重构那些代码行。
-
atzz - 值是原始类型 - 这不应该发生,除非时空发生扭曲。 Miky D - 建议?请记住,这是针对 lambda 表达式的,所以我想保持简短。此外,我将添加 cmets,它应该为任何查看代码的人澄清事情。
-
好吧,每种情况都不同,如果不查看其余代码,我无法提出任何明智的建议,但也许您可以创建一个执行比较的函数并在 lambda 中调用它。
-
“另外我会添加 cmets,这应该可以澄清事情......” 不要评论不可读的代码。使代码可读(当然在可能的情况下)。在这种情况下当然是可能的。
标签: c# .net ternary-operator associativity