如果表达式为真/假,如何使用三元
? :
条件执行多个操作?
wbsource = (exp) ? (Do one thing) : (Do second thing)
wbsource = (exp) ? (Do one thing) (Do second thing) : (Do second thing)
例如:
为什么我不能在
?
和:
之间执行三个操作
filename = (fp!=null) ? fp; Properties.Settings.Default.filename=fp; Properties.Settings.Default.Save; : Properties.Settings.Default.file;
使用简单的 if 条件,我会用简单的方式编写,例如:
if(fp!null)
{
filename = fp;
Properties.Settings.Default.filename;
Properties.Settings.Default.Save();
}
else
{
filename = Properties.Settings.Default.file
}
使用上面的三元运算符来编写一个简单的方法是什么?
为什么我不能在 之间执行三个操作?和:
因为这些是操作数,也就是表达式。每个表达式计算一个值;您想要多个语句。来自 Eric Lippert 关于 foreach
与
ForEach
的博客文章:
第一个原因是这样做违反了所有其他序列运算符所基于的函数式编程原则。显然,调用此方法的唯一目的是引起副作用。
表达式的目的是计算一个值,而不是产生副作用。语句的目的是引起副作用。这个东西的调用点看起来非常像一个表达式(不过,不可否认,由于该方法是返回 void 的,所以该表达式只能在“语句表达式”上下文中使用。)
您绝对应该使用
if
块来编写此内容。更清楚了。
如果你真的,真的想为此使用条件运算符,你可以写:
// Please, please don't use this.
Func<string> x = () => {
Properties.Settings.Default.filename = fp;
Properties.Settings.Default.Save();
return fp;
};
string filename = fp == null ? Properties.Settings.Default.file : x();
条件运算符是三元运算符(不是一元运算符),不能替代
if
语句。它是一个返回两个结果之一的运算符。虽然你可以在某种程度上链接它:
var result = someBool ? "a" : (otherBool ? "b" : "c");
这有点难以阅读。此外,您尝试调用
Save()
函数,该函数不会返回结果,因此您不能将其与此运算符一起使用。
如果这是
c
你会没事的,感谢 “逗号运算符”:
int b;
int a = (1==1) ? (b=6, somemethod(), 1) : (b=7, 2);
这里
b
将被设置为6,somemethod
将被调用,然后a
被设置为1。
幸运的是,这是一个没有移植的功能,使用
if..else
它更清晰。
如果你真的非常想要,你可以使用一个有 副作用的函数:
filename = (fp!=null) ? DoOneThing(...) : DoAnotherThing(...);
尽管维护你的代码的人不会感谢你。
简短的回答,使用
if
块,这是唯一明智的做法。
其他答案,针对又脏又臭的疯子。
filename = (fp!=null) ? Func<string> {fp = Properties.Settings.Default.filename; Properties.Settings.Default.Save; return fp;} : Properties.Settings.Default.file;