关于c#:我可以在返回值时执行代码吗?

Can I execute a code when returning a value?

我想知道我是否可以缩短这一点:

1
2
3
4
5
6
7
8
9
10
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;
 }

对于这样的事情:

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

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

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


你可以写:

1
2
3
4
5
6
7
8
9
10
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)?在Javascript中你不需要它,事实上在那种语言中它是一种常见的模式。在C#中,它不是因为它不可读和丑陋。

注意最后的()来执行匿名方法。

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

1
2
3
4
5
6
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
2
3
4
5
6
7
8
9
10
11
12
bool Check()
{
    if (textBox1.Text.All(char.IsDigit))
    {
        return true;
    }
    else
    {
        MessageBox.Show("The data you entered is incorrect","Error",MessageBoxButtons.OK);
        return false;
    }
}


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

So I need to keep in brain that I'm showing error dialog inside lambda
function which is part of ternary operator which checks whether all
chars somewhere are digits. And all this staff happens in method call
context where you checking something (you are already in the middle of some functionality).

普通人可以在工作记忆中保留大约7件事。如果添加更多信息,则会开始忘记以前的数据。为什么要让方法变得如此简单?简单的方法将允许您在大脑中保持更高级别的背景。

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

1
2
3
4
bool IsSocialSecurityNumberValid(string ssn)
{
    return ssn.All(char.IsDigit);
}

并调用此方法:

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