C#提供了条件运算符(?:(,该运算符根据布尔表达式的值返回两个值中的一个。例如
condition ? first_expression : second_expression;
我的问题是,当条件为true时,我们可以使用相同的语法来调用方法吗?当条件为假时,则不执行
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
}
?:
在过去也被称为三元运算符。三元,三元。如果这样,那么就这样做,否则就这样做。
你有两个表达式。如果这样,就这样做。这正是if
语句的要点。你正试图将你的案例融入一个并非为之设计的结构中不要这样做。
对作业使用正确的操作:
if(val.HasValue)
{
list.Add(val.value)
}
C#条件运算符用于根据条件的求值返回不同的值。它并不意味着习惯于以你在问题中试图的方式使用。它应该这样使用:
int test = i > 3 ? 0 : 1;
如果i
小于(或等于(3,那么test
将等于0,或者如果3大于3,则test
将等于1。
要想做你想做的事,你必须使用一个常规的if
语句(顺便说一句,你仍然可以写在一行中(:
if (val.HasValue) list.Add(val.value);
条件/三元运算符应该返回一个值,而这个非常特定的值必须分配回某个地方。
所以,在这种情况下,你可以这样做,是的。但是,这会导致糟糕的设计。
在通常的情况下,人们会这样做:
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)
将是最简单的方法。
null条件运算符的工作方式是,您必须为要分配给它的变量返回一个值。因此,如果您想要一个字符串值或void
以外的其他值,则可以调用该方法而不会出现任何问题。但是要调用void
方法,可以使用委托。
delegate void DelMethod();
void Method() { }
void MethodTwo() { }
private void MyMethod()
{
DelMethod x;
x = condition == true ? (DelMethod)Method : (DelMethod)MethodTwo;
}