返回值时可以执行代码吗?

时间:2015-05-09 15:57:41

标签: c# lambda return

我想知道我是否可以缩短它:

bool Check()
 {
 return textBox1.Text.All(char.IsDigit) ? true : Falsepath();
 }

 bool Falsepath()
 {
 MessageBox.Show("The data you entered is incorrect","Error",MessageBoxButtons.OK);
 return false;
 }    

对于这样的事情:

    bool Check()
        { 
        return textBox1.Text.All(char.IsDigit) ? true : (sender, e) => 
                {
                MessageBox.Show("The data you entered is incorrect", "Error", MessageBoxButtons.OK); 
                return false;
                };
        }

当然,我输入的第二个代码不正确,但我以它为例。

那么,我可以在检查某些内容时执行代码,还是必须使用单独的功能?

3 个答案:

答案 0 :(得分:2)

你可以写:

bool Check()
{
    return textBox1.Text.All(char.IsDigit) ? 
           true : 
           ((Func<bool>)(() =>
           {
               MessageBox.Show("The data you entered is incorrect", "Error", MessageBoxButtons.OK);
               return false;
           }))();
}

但是很糟糕,请不要这样做! ......

遗憾的是,在C#中,您必须明确告诉编译器匿名函数的类型。这使一切变得更加复杂。看到演员(Func<bool>)?在Javascript中你不需要它,事实上在那种语言中它是一种常见的模式。在C#中,并不是因为它不可读且丑陋

请注意执行匿名方法的最终()

请注意,在这种特殊情况下,您可以写:

bool Check()
{
    return textBox1.Text.All(char.IsDigit) ? 
           true : 
           MessageBox.Show("The data you entered is incorrect", "Error", MessageBoxButtons.OK) == DialogResult.Abort;
}

所以请调用MessageBox.Show()并以比较为false的方式比较其结果。

答案 1 :(得分:1)

你真的需要三元运算符吗?

bool Check()
{
    if (textBox1.Text.All(char.IsDigit))
    {
        return true;
    }
    else
    {
        MessageBox.Show("The data you entered is incorrect","Error",MessageBoxButtons.OK);
        return false;
    }
}

答案 2 :(得分:0)

阅读和维护此类代码很痛苦。在顶层你有三元运算符,它被加载到开发人员的大脑(工作记忆)中。然后添加lambda表达式,也应该加载它。然后添加一些通知用户的功能。

  

所以我需要保持大脑,我在lambda中显示错误对话框   作为三元运算符的一部分的功能,检查是否全部   chars某处是数字。所有这些工作人员都在方法调用中发生   检查某些内容的上下文(您已经处于某些功能的中间位置)。

Average person can keep about 7 things in the working memory.如果您添加更多信息,则会开始忘记以前的数据。为什么要让方法变得如此简单?简单的方法可以让你在大脑中保持更多的高级环境。

另一个问题是混淆方法名称,它应该只检查一些东西。它不应该通知用户或做其他操作。并为方法和控件提供有意义的名称。

bool IsSocialSecurityNumberValid(string ssn)
{
    return ssn.All(char.IsDigit);
}

并调用此方法:

if (!IsSocialSecurityNumberValid(ssnTextBox.Text))
   MessageBox.Show("SSN should contain only digits", "Error", MessageBoxButtons.OK);