【问题标题】:Using Try Catch to find Boolean value使用 Try Catch 查找布尔值
【发布时间】:2012-02-28 16:31:54
【问题描述】:

我有几个布尔值检查。我想检查任何返回 false 的值然后做点什么。

我尝试了以下操作:

bool formIsValid = true;

try{

    Utility.testStringHasValue(txEmail.Text);   <--- true
    Utility.testStringHasValue(txFirstName.Text);  <--- true
    Utility.testStringHasValue(txLastName.Text);  <--- FALSE
    Utility.testStringHasValue(txUserEmployer.Text); <--- true
    Utility.testStringHasValue(txUserPassword.Text); <--- true
    Utility.testStringHasValue(txUserPassword2.Text); <--- true
}
catch (Exception)
{
    formIsValid = false
}

.. 任何其他解决方案,因为这个根本没有!

更新

我完全删除了 Try/Catch 并使用了:

bool isFormValid = Utility.testStringHasValue(txEmail.Text)
                && Utility.testStringHasValue(txFirstName.Text)
                && Utility.testStringHasValue(txLastName.Text)
                && Utility.testStringHasValue(txUserEmployer.Text)
                && Utility.testStringHasValue(txUserPassword.Text)
                && Utility.testStringHasValue(txUserPassword2.Text)
                && (txUserPassword.Text == txUserPassword2.Text);

【问题讨论】:

  • 不是一个很好的异常处理案例。
  • 什么是Utility.testStringHasValue
  • 这里的 try/catch 基本上充当了一个未标记的 goto :(

标签: c# boolean try-catch


【解决方案1】:

不要在这种情况下使用异常,当抛出异常时会影响性能。

还有一种方法可以检查是否输入了字符串(String.IsNullOrEmpty)

您可以使用 &&(和)运算符来验证所有字段是否有效。

例如:

bool isValid = !String.IsNullOrEmpty(txtEmail.Text) && !String.IsNullOrEmpty(txtFirstname.Text) && !String.IsNullOrEmpty(txtLastName.Text);

或者,您可以使用 ||(或)运算符将其翻转

bool isInvalid = String.IsNullOrEmpty(txtEmail.Text) || String.IsNullOrEmpty(txtFirstname.Text) || String.IsNullOrEmpty(txtLastName.Text);

【讨论】:

    【解决方案2】:

    如果您编写了 Utility 方法,那么我建议确保它不会引发异常,尤其是如果它返回一个指示字符串是否具有值的布尔值。

    您可以执行以下操作,并完全避免使用 try { } catch { }

    bool formIsValid = Utility.testStringHasValue(txEmail.Text);   <--- true
                       && Utility.testStringHasValue(txFirstName.Text);  <--- true
                       && Utility.testStringHasValue(txLastName.Text);  <--- FALSE
                       && Utility.testStringHasValue(txUserEmployer.Text); <--- true
                       && Utility.testStringHasValue(txUserPassword.Text); <--- true
                       && Utility.testStringHasValue(txUserPassword2.Text); <--- true
    

    &amp;&amp; 不会调用评估右侧,除非左侧返回 true,因此 Utility.testStringHasValue 在您的示例中实际上只会被调用 3 次。

    【讨论】:

      【解决方案3】:
      if ( Utility.testStringHasValue(txEmail.Text) &&
           Utility.testStringHasValue(txFirstName.Text) &&
           Utility.testStringHasValue(txLastName.Text) &&
           Utility.testStringHasValue(txUserEmployer.Text) &&
           Utility.testStringHasValue(txUserPassword.Text) &&
           Utility.testStringHasValue(txUserPassword2.Text)
      ) { 
        all_good = true;
      } else {
        no_so_good = true;
      }
      

      不应将异常处理用作控制逻辑。它混淆了目的。

      【讨论】:

        【解决方案4】:

        这是因为返回 false 不会引发异常。你总是可以这样做的:

        if (!(
            Utility.testStringHasValue(txEmail.Text) &&
            Utility.testStringHasValue(txFirstName.Text) &&
            Utility.testStringHasValue(txLastName.Text) &&
            Utility.testStringHasValue(txUserEmployer.Text) &&
            Utility.testStringHasValue(txUserPassword.Text) &&
            Utility.testStringHasValue(txUserPassword2.Text)))
        {
            throw new Exception("Something is false");
        }
        

        【讨论】:

          【解决方案5】:
          if ( !(condtion1 && condition2 && .... && conditionN) )
          {
            // first condition evaluating to false gets you here
            // anything afterwards is not checked.
          }
          

          【讨论】:

            【解决方案6】:

            重新编码您的 Utility.testStringHasValue() 以返回 false,而不是引发异常。 下一个

            formIsValid= Utility.testStringHasValue(txEmail.Text) &&
                Utility.testStringHasValue(txFirstName.Text) &&
                Utility.testStringHasValue(txLastName.Text) && 
                Utility.testStringHasValue(txUserEmployer.Text) &&
                Utility.testStringHasValue(txUserPassword.Text) &&
                Utility.testStringHasValue(txUserPassword2.Text) ;
            
            if (formIsValid) {
                //whatever
            } else {
                //whatever
            }
            

            【讨论】:

              【解决方案7】:

              testStringHasValue 返回什么?如果是布尔值,则只需使用所有组合的返回值,如下所示:

              boolean result = true;
              result = result && Utility.testStringHasValue(txEmail.Text); 
              result = result && Utility.testStringHasValue(txFirstName.Text);
              return result;
              

              您使用异常的方式不是很好。它们不应该用于这种验证,并且只有在您实际抛出异常时才有效,因为它返回一个布尔值 false 值。

              【讨论】:

                【解决方案8】:

                try..catch 异常处理在资源方面比简单的布尔检查更昂贵。来自 msdn 站点的回复:try..catch:“在运行时捕获异常会产生额外的开销,并且可能比预先检查以避免异常要慢。” 如前所示使用 if..then。

                【讨论】:

                  【解决方案9】:

                  您是否考虑过编写一个可重用的方法来检查传递给它的所有值是否为空?如果您在多个地方使用代码,这样的事情可能会节省大量时间:

                  using System.Linq;
                  
                  public static class Utility
                  {
                      public static bool EnsureValuesNotEmpty(params string[] values)
                      {
                          return values.All(value => !string.IsNullOrWhiteSpace(value));
                      }
                  }
                  

                  然后你可以用更少的代码重用这个功能,只需将你想要检查的所有值传递给它:

                  var formIsValid = Utility.EnsureValuesNotEmpty(txEmail.Text,
                                                                 txFirstName.Text,
                                                                 txLastName.Text,
                                                                 txUserEmployer.Text,
                                                                 txUserPassword.Text,
                                                                 txUserPassword2.Text);
                  

                  【讨论】:

                    猜你喜欢
                    • 2012-10-24
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-09-18
                    • 2012-11-25
                    • 2018-11-05
                    • 2019-12-04
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多