C#提供conditional operator (?:),它返回两个值中的一个,具体取决于布尔表达式的值。例如
condition ? first_expression : second_expression;
我的问题是,当条件为真时,我们可以使用相同的语法来调用方法吗?当条件为假时,则什么都不做
public void Work(int? val)
{
var list = new List<int>();
//ofcourse line below doesn't work
//but is it possible to call method when condition is true and else do nothing
val.HasValue? list.Add(val.value) : else do nothing
}
答案 0 :(得分:5)
<xsl:strip-space elements="*"/>
过去也被称为三元运算符。三元,三个。如果这样,那么这样做,否则就这样做。
你有两个表达方式。如果是这样,请这样做。这正是?:
语句的要点。您正在尝试将您的案例融入不是为其设计的构造中。 不要这样做。
对作业使用正确的操作:
if
答案 1 :(得分:2)
C#条件运算符用于根据条件的评估返回不同的值。它并不意味着习惯于在您的问题中尝试使用。它应该用于此:
int test = i > 3 ? 0 : 1;
如果test
小于(或等于)3,则 i
将等于0,如果3大于3,则test
将等于1。
要做你想做的事,你必须使用常规if
语句(顺便说一句,你仍然可以写成一行):
if (val.HasValue) list.Add(val.value);
答案 2 :(得分:2)
条件/三元运算符应该返回一个值,并且必须将非常具体的值分配回某个地方。
所以,在那种情况下你可以做到,是的。但是,这会导致糟糕的设计。
在常规情况下,人们会这样做:
int x = (a > b) ? a : b;
现在,假设当条件呈现为true时,AddToList()是您想要的方法,如果条件变为false,则DoRest()是您要调用的方法。
在上述情况下,你最终会做这样的事情:
int result = val.HasValue? AddToList(val.value) : DoRest();
现在你必须依靠result
来找出哪一个被调用(如果你需要的话)并且它不是很有表现力并且没有指向正确的代码设计。
如果你有点冒险,你最终会得到:
var actionToInvoke = val.HasValue ? (Action)AddToList: (Action)DoRest;
actionToInvoke();
在任何情况下,这些都不会导致代码非常易读。
所以,坚持使用简单的if(val.HasValue)
将是最简单的方法。
答案 3 :(得分:1)
null条件运算符的工作方式是您必须为要为其分配的变量返回一个值。因此,如果您想要一个字符串值或void
以外的其他内容,您可以调用该方法而不会出现任何问题。但是要调用void
方法,您可以使用委托。
delegate void DelMethod();
void Method() { }
void MethodTwo() { }
private void MyMethod()
{
DelMethod x;
x = condition == true ? (DelMethod)Method : (DelMethod)MethodTwo;
}