?不带其他部分的运算符

问题描述 投票:19回答:3

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

这是否有可能?如果是这样,使用一种方法相对于另一种方法有什么好处?如果没有,您为什么不能够做到这一点?

c# theory conditional-operator
3个回答
19
投票

您可以做:

someBool = (someStatement) ? true : someBool;

我不认为这能使您更加清楚:

if (someStatement)
{
    someBool = true;
}

但是这似乎确实是一个品味问题。我不会说任何一个都明显不好,但是前者并不常见,所以我可能会避免。


您问为什么不能像这样使用运算符:

someBool = (someStatement) ? true : ;

这将是一个很大的语言更改!请记住,作业看起来像这样:

<location> = <expression>;

对该表达式求值以提供一些值,并且该值存储在location中。 (根据位置是变量,属性,字段还是索引表达式,“存储”操作可能会大不相同。)

这里您建议右边的表达式的值,除了它的正常值外,还可以是一个“不变”值,这种特殊的行为是在赋值语句中使用它会导致没有发生存储操作。这不同于任何其他正常值,并且可能令人惊讶。但是,如果在其他地方使用它会意味着什么呢?

// 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:);

我认为您在所有这些情况下都很难为操作员提供明智,直观和一致的行为,除了简单的任务外,我认为这不会有用。它只是与其他语言不兼容-包括它会使该语言更难于学习,阅读,理解,实施和解释。简而言之,这是不值得的。


16
投票

基本上,您正在尝试将条件运算符用于非设计目的。

这并不意味着可以选择采取某些措施 ...这是为了评估一个或另一个表达式,而这是表达式的结果。

[如果只希望在满足某些条件时执行操作,请使用if语句-正是它的用处。

在您的示例中,您可以使用:

// Renamed someStatement to someCondition for clarity
someBool |= someCondition;

someBool = someCondition ? true : someBool;

...换句话说,“除非someCondition为真,否则请使用现有值...但就我个人而言,我认为原始的if陈述更加清晰。


0
投票

某些背景:我们经常使用这样的构造:

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>
© www.soinside.com 2019 - 2024. All rights reserved.