如何在没有太多混乱的情况下轻松地将语句转换为表达式? 我想更新一个变量,然后从“?”运算符内部“返回”一个不同的值,并将其存储在变量中。
这个问题可以使用C ++的邪恶逗号运算符解决,在JS中使用立即调用的箭头函数在JS中解决,在F#中要感谢所有ifs都是表达式等。
为了确保清楚,我将编写可以实现我想要的功能的C ++代码:
MyStruct obj;
int x = NULL;
x = x ? x : (setObj(obj), obj.x);
但是在C#中这看起来非常丑陋,因为没有逗号运算符,并且使用一个参数和一行来更新变量而另一行来检索值来创建匿名Func的语法已经占用了更多空间,并且与仅使用普通的if语句相比,降低代码的可读性。
答案 0 :(得分:3)
已更新以回答更新的问题并使用?? =运算符:
如果setObj返回对象,则:
x ??= setObj(obj).x
如果setObj返回的内容不是void
:
x ??= (setObj(obj) is var _ ? obj.x : 0);
如果setObj返回void
(根据@ haim770注释):
x ??= new Func<MyStruct>(() => { setObj(obj); return obj; })().x;
后两者的可读性令人怀疑。
原始问题的答案:
怎么样:
MyStruct obj;
int? x = null;
x ??= (obj = getObj()).x
答案 1 :(得分:2)
您可以这样做:
MyStruct obj;
int? x = null;
x = x ?? (obj = getObj())?.x;
我刚刚添加了?。如果getObj返回null。 除了建议压缩代码,我还建议您研究可读性和调试代码的简便性
答案 2 :(得分:1)
如果我对您的理解正确,那么您想要一个内联函数吗?然后您可以使用:
var k = true;
Func<int, bool> greater = (x) => x > 1;
k = k ? k : greater(1);