我用C#?运算符,当我有if语句影响一行,这一切都很好。但是让我说我有这个代码(使用经典的if语句):
if(someStatement)
{
someBool = true; //someBools value is unknown
}
else
{
//Do nothing
}
这可以通过以下方式在单线上实现:
someBool = (someStatement) ? true : someBool;
但为什么我不能这样做:
someBool = (someStatement) ? true : ;
//or possibly
someBool = (someStatement) ? true;
这有可能吗?如果是,使用一种方法比另一种方法有什么好处吗?如果没有,你为什么不能这样做?
答案 0 :(得分:17)
你可以这样做:
someBool = (someStatement) ? true : someBool;
我认为这不会让你明白:
if (someStatement)
{
someBool = true;
}
但这似乎是一种品味问题。我不会说两者都显然不好,但前者并不常见,所以我可能会避免它。
你问为什么你不能像这样使用运营商:
someBool = (someStatement) ? true : ;
这将是一个非常大的语言变化!请记住,赋值看起来像这样:
<location> = <expression>;
对表达式求值以给出一些值,并将该值存储在位置中。 (根据位置是变量,属性,字段还是索引表达式,&#34;存储&#34;操作可能完全不同。)
这里你提出右边的表达式的值除了正常值之外,还可以是&#34; no-change&#34; value,具有特殊行为,当您在赋值语句中使用它时,它不会导致存储操作发生。这与任何其他正常值不同,并且可能令人惊讶。但是如果你在其他地方使用它会是什么意思呢?
// Does this call DoSomething when cond is false?
// If so, what value is passed to it?
someObject.DoSomething(cond?x:);
// What happens here if cond is false? Does it cancel
// the entire assignment?
int x = 77 + (cond?2:) * 3 - 4;
// If cond is false, are methods F1 and F2 called or not called?
int x = F1() + (cond?2:) + F2();
// What does this do? Does it skip the return if cond is false?
return (cond?2:);
我认为你很难在所有这些情况下为操作员提出合理,直观和一致的行为,而且我认为除了简单之外的其他任何地方都不会有用分配。它与其他语言不相适应 - 包括它会使语言更难学习,阅读,理解,实施和解释。只是为了一点点简洁,这是不值得的。
答案 1 :(得分:16)
基本上,你试图将条件运算符用于不是为它设计的东西。
这并不意味着可以选择采取某些行动 ...它意味着评估一个或另一个表达式,这是表达式的结果。
如果您只想在满足某些条件时执行操作,请使用if
语句 - 这正是它的用途。
在您的示例中,您可以使用:
// Renamed someStatement to someCondition for clarity
someBool |= someCondition;
或
someBool = someCondition ? true : someBool;
...换句话说“除非someCondition
为真,否则”使用现有值...但就个人而言,我认为原始的if
陈述更清晰。
答案 2 :(得分:4)
一些背景:我们经常使用这样的构造:
sql = "SELECT x FROM table WHERE Y " + (condition ? " AND Column = 1" : "");
我们还在Razor视图中使用了类似的构造
<div class='someclass @(condition ? "anotherclass" : "")'></div>
: ""
很烦人,所以我们建立了扩展方法
public static T Then<T>(this bool value, T result)
{
return value ? result : default(T);
}
用法:
<div class='someclass @condition.Then("anotherclass")'></div>
取自here