我使用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;
这是否有可能?如果是这样,使用一种方法相对于另一种方法有什么好处?如果没有,您为什么不能够做到这一点?
您可以做:
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:);
我认为您在所有这些情况下都很难为操作员提供明智,直观和一致的行为,除了简单的任务外,我认为这不会有用。它只是与其他语言不兼容-包括它会使该语言更难于学习,阅读,理解,实施和解释。简而言之,这是不值得的。
基本上,您正在尝试将条件运算符用于非设计目的。
这并不意味着可以选择采取某些措施 ...这是为了评估一个或另一个表达式,而这是表达式的结果。
[如果只希望在满足某些条件时执行操作,请使用if
语句-正是它的用处。
在您的示例中,您可以使用:
// Renamed someStatement to someCondition for clarity
someBool |= someCondition;
或
someBool = someCondition ? true : someBool;
...换句话说,“除非someCondition
为真,否则请使用现有值...但就我个人而言,我认为原始的if
陈述更加清晰。
某些背景:我们经常使用这样的构造:
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>