2015-05-09 58 views
1

我在想,如果我可以缩短这个:返回值时可以执行代码吗?

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; 
       }; 
     } 

当然,我进入第二个代码不正确的,但我使用它作为一个例。

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

+1

无 - 三元运营商期望的2分的结果是准确相同的类型。 –

+1

有'if'运算符,使用它。不要以不正当的方式滥用语法糖。 –

+0

@ General-Doomer“if”是一个关键字。 '?'是一个运算符 – xanatos

回答

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它的结果进行比较。

+0

聪明,可怕。什么是在C#中调用的'()'语法?这不是我想象的IIFE,因为这是一个Javascript概念。 –

+0

@DavidL这是标准的方法执行。如果有参数,它将是'(foo)'。这部分在JS中是一样的。 – xanatos

+0

啊,对,我现在看到它。你是对的,它是不可读的。语法完全混淆了我。 –

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; 
    } 
} 
+0

不适用于我在此处作为示例编写的代码,但对于我正在使用的代码是。我有很多东西要检查 –

0

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

所以我需要保持在大脑中我展示里面的λ错误对话框 函数,它是三元运算符,检查所有 字符某处是否是数字的一部分。所有这些人员都会在方法调用 上下文中检查某些内容(您已经处于某种功能的中间)。

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); 
+0

事情是,这个检查实际上是一个社会安全号码。我只是想给用户提供有意义的反馈(而不是显示一个消息框,上面写着“你输入的数据不正确”)到一个有10个文本框的表单 –

+0

@AndiAbrudan抱歉,没有得到你 –

+0

我'我说我有很多东西在表格上。我只是想用户友好并给出有意义的反馈,当出现问题时不显示消息,并让用户弄清楚他输入的内容不正确 –