【问题标题】:Can I execute a code when returning a value?返回值时可以执行代码吗?
【发布时间】:2015-07-20 10:42:50
【问题描述】:

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

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

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

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

【问题讨论】:

  • 否 - 三元运算符期望 2 个结果是完全相同的类型。
  • if 运算符,使用它。不要以不正确的方式滥用语法糖。
  • @General-Doomer if 是一个关键字。 ? 是一个运算符
  • 算子、键、语句……没关系。使用它,而不是带有 Func 或其他东西的丑陋构造。

标签: c# lambda return


【解决方案1】:

你可以写:

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&lt;bool&gt;) 的演员表了吗?在 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 的方式比较其结果。

【讨论】:

  • 聪明又可怕。 C# 中调用的() 语法是什么?这不是我想象的 IIFE,因为那是一个 Javascript 概念。
  • @DavidL 是标准方法执行。如果有参数,则为(foo)。这部分在 JS 中是一样的。
  • 啊,对了,我现在明白了。你是对的,它是不可读的。语法完全让我感到困惑。
  • @DavidL 它甚至会让非专业的 JS 程序员感到困惑 :-) 参见 stackoverflow.com/a/9091416/613130 以了解带有 ! 的更邪恶的 Javascript 版本 :-)
  • @David L () => Lambda 表达式 () 是参数
【解决方案2】:

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

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

【讨论】:

  • 不是为了我在这里写的代码作为例子,而是为了我正在使用的代码是的。我有很多事情要检查
【解决方案3】:

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

所以我需要记住我在 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);

【讨论】:

  • 问题是,这张支票实际上是针对社会安全号码的。我只是想向具有 10 个文本框的表单提供有意义的反馈(而不是显示“您输入的数据不正确”的消息框)
  • @AndiAbrudan 抱歉,没找到你
  • 我的意思是我在表格上有很多事情要做。我只是想对用户友好并提供有意义的反馈,而不是在出现问题时显示消息并让用户找出他输入的错误
  • @AndiAbrudan 仍然不明白。不管你有 1 个文本框还是 100 个文本框。复杂的代码不会减少文本框的数量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2011-01-04
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多