在c#中我可以用速记做这样的事吗?
bool validName = true;
if (validName)
{
name = "Daniel";
surname = "Smith";
}
else
{
MessageBox.Show("Invalid name");
}
我只是想知道类似的东西是否会起作用,但在这个确切的场景中,我知道你可以分配值,如果我的名字= validName? "丹尼尔" :"无效",但我只是想知道我能否做到以下几点?
validName ?
{
name = "Daniel";
surname = "Smith";
}
:
{
MessageBox.Show("Invalid name");
}
答案 0 :(得分:9)
滥用lambda语法和类型推断:
(validName
? (Action)
(() =>
{
name = "Daniel";
surname = "Smith";
})
: () =>
{
MessageBox.Show("Invalid name");
})();
我知道,不是真正的答案。如果语句更好:显然这种语法的可读性较差,更重要的是它具有不同的运行时行为,并且可能导致意外的副作用,因为lambda表达式可能会产生闭包。
语法也有点神秘。它首先创建两个Action
个对象,然后?:
运算符在它们之间选择,最后执行所选结果:
var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });
Action resultingAction = test_variable ? a1 : a2;
resultingAction();
我通过执行生成的操作将其放在一个语句中。为了使它更简洁,我将第一个lambda表达式转换为Action
(而不是显式创建new Action()
)并利用类型推断我省略了第二个演员。
答案 1 :(得分:6)
让我们说你可以做到。为什么呢?
动机是什么?
线路少?不足以发挥作用。 性能?没有,编译器会为你处理一些事情。 明晰?如果/ else更清晰,更容易被大多数开发人员理解。
我相信,如果你努力工作,你可以找到办法解决这个问题(很可能是一个问题),但我仍然无法确定原因。
答案 2 :(得分:5)
没有
三元运算符(?:)作为一个整体必须是一个表达式 - 也就是说,可以分配给某些东西。
答案 3 :(得分:4)
条件运算符要求其第二个和第三个操作数是返回值的表达式(除了满足某些类型限制),而不是不解析为值的语句。您没有希望从当前正在执行的任何操作返回的值。
为了使代码编译,你可以返回一些荒谬的值,但是那时你只需要添加更多的工作,而不仅仅是使用if
这是你的正确语义运算符。要求,所以虽然技术上可行,但这不是一个好主意。
答案 4 :(得分:1)
fullName = validName == true ? returnName(firstName)+" "+returnName(lastName) : validName == false ? invalidName("Invalid Name") : null
public string returnName(string name)
{
return name;
}
public string invalidName(string invalid)
{
MessageBox.Show(invalid);
return null;
}
正如其他人可能已经说过你可能真正想要做的事情,但是,有可能:P