?没有其他部分的操作员

时间:2014-07-24 13:18:31

标签: c# theory conditional-operator

我用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;

这有可能吗?如果是,使用一种方法比另一种方法有什么好处吗?如果没有,你为什么不能这样做?

3 个答案:

答案 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