在执行操作之前,如何检查ALL方法是否为真

use*_*417 3 c# winforms

我有一个问题,我在表单中实施了大约5次验证检查.每个都位于自己的方法中Is_XXX_Valid().我正在寻找一种方法来确定每个方法return true;应该显示错误消息.

然而,这是出现问题的地方,我有一个部分工作的解决方案,因为如果先前的方法返回,则无法运行后续方法 false

这是我正在使用的当前代码:

private void Button_Click(object sender, EventArgs e)
  {
    DialogResult validation_msgbox = MessageBox.Show("Are you sure you would like to submit this form?", "Submit Form?", MessageBoxButtons.YesNo);

    // Run each validaion check

    if (IsAAAValid() && IsBBBValid())
    {
      //Continue and submit data
    }
    else
    {
      //Display the errors
      DialogResult Textbox_validation = MessageBox.Show(ErrorText, "Some errors were found.", MessageBoxButtons.OK);
    }
  }
Run Code Online (Sandbox Code Playgroud)

使用上面的代码作为示例,如果IsAAAValid()返回false,则不执行第二个方法,因此未验证其中的数据,如果发现多个错误,则导致不正确的对话框.

谢谢!

adv*_*v12 8

这被称为"短路评估",您可以在这里阅读,是C#编程语言通常需要的功能.你可以用这样的东西解决它:

bool avalid = IsAAAValid();
bool bvalid = IsBBBValid();
if (avalid && bvalid)
{
  //Continue and submit data
}
Run Code Online (Sandbox Code Playgroud)

这将保证两种方法都能运行.

作为旁注,为了清楚您的代码,我建议您重命名验证方法,以表示它们有副作用.也就是说,它们不仅仅是简单地返回数据的状态; 他们实际上有可能修改状态.这就是为什么在这种情况下短路评估会引起问题的原因.


ang*_*son 6

正如adv12已经回答的那样,这被称为短路评估,但也有一种替代他重构代码的方式.

有两个布尔运算符:

  • && - 短路评估
  • & - 全面评估

因此,您可以简单地切换到使用&以调用两种方法,无论如何

if (IsAAAValid() & IsBBBValid())
                 ^
                 |
                 +-- only one &, not two &&
Run Code Online (Sandbox Code Playgroud)

现在,说了这些,我个人会像adv12那样编写代码,因为它更容易阅读代码,而不是很容易发现只使用一个代码,&但我想我会发布完整性的答案.

  • 很好的答案,特别建议不要那样做:).几乎可以肯定的是,下一个看到代码的人会用`&&'替换`&`并调用原始作者姓名......而且一周之后花一天时间试图弄清楚为什么代码不再正确地报告错误. (2认同)