adm*_*tDK 5 c# lambda shorthand-if
在c#中我可以用速记做这样的事情吗?
bool validName = true;
if (validName)
{
name = "Daniel";
surname = "Smith";
}
else
{
MessageBox.Show("Invalid name");
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道类似的东西是否会起作用,但在这个确切的场景中,我知道你可以分配值,如果我的名字= validName?"丹尼尔":"无效",但我只是想知道我能否做到以下?
validName ?
{
name = "Daniel";
surname = "Smith";
}
:
{
MessageBox.Show("Invalid name");
}
Run Code Online (Sandbox Code Playgroud)
滥用lambda语法和类型推断:
(validName
? (Action)
(() =>
{
name = "Daniel";
surname = "Smith";
})
: () =>
{
MessageBox.Show("Invalid name");
})();
Run Code Online (Sandbox Code Playgroud)
我知道,不是真正的答案.如果语句更好:显然这种语法的可读性较低,更重要的是它具有不同的运行时行为,并且由于lambda表达式创建的潜在闭包,可能导致意外的副作用.
语法也有点神秘.它首先创建两个Action对象,然后?:操作员在它们之间选择,最后执行所选择的结果:
var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });
Action resultingAction = test_variable ? a1 : a2;
resultingAction();
Run Code Online (Sandbox Code Playgroud)
我通过执行生成的操作将它放在一个语句中.为了使它更简洁,我将第一个lambda表达式转换为Action(而不是new Action()显式创建)并利用类型推断我省略了第二个转换.
让我们说你可以做到这一点.为什么?
动机是什么?
线路少?不足以发挥作用.性能?没有,编译器会为你处理一些事情.明晰?如果/ else更清楚,并且更容易被大多数开发人员理解.
我相信,如果你努力工作,你可以找到一种方法来处理这个问题(很可能是一个kludge),但我仍然无法确定原因.
没有.
作为一个整体,三元运算符(?:)必须是一个表达式 - 也就是说,可以分配给某些东西.