用表达式代替语句

时间:2020-01-09 12:49:47

标签: c#

如何在没有太多混乱的情况下轻松地将语句转换为表达式? 我想更新一个变量,然后从“?”运算符内部“返回”一个不同的值,并将其存储在变量中。

这个问题可以使用C ++的邪恶逗号运算符解决,在JS中使用立即调用的箭头函数在JS中解决,在F#中要感谢所有ifs都是表达式等。

为了确保清楚,我将编写可以实现我想要的功能的C ++代码:

MyStruct obj;
int x = NULL;
x = x ? x : (setObj(obj), obj.x);

但是在C#中这看起来非常丑陋,因为没有逗号运算符,并且使用一个参数和一行来更新变量而另一行来检索值来创建匿名Func的语法已经占用了更多空间,并且与仅使用普通的if语句相比,降低代码的可读性。

3 个答案:

答案 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);