使用三元运算符进行多个操作
本文关键字:操作 运算符 三元 | 更新日期: 2023-09-27 18:27:12
如果表达式为真/假,如何使用三元? :
条件执行多个操作?
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;