使用Try-Catch查找布尔值
本文关键字:布尔值 查找 Try-Catch 使用 | 更新日期: 2023-09-27 18:26:06
我对值进行了几次布尔检查。我想检查返回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);
不要在该场景中使用异常,当抛出异常时,性能会受到影响。
还有一种方法可以检查是否输入了字符串(string.IsNullOrEmpty)
您可以使用&(and)运算符来验证所有字段是否有效。
例如:
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);
如果您编写了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
除非左侧返回true
,否则&&
不会调用右侧的evaluate,因此在您的示例中,Utility.testStringHasValue
实际上只被调用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;
}
异常处理不应用作控制逻辑。它混淆了目的。
这是因为返回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");
}
if ( !(condtion1 && condition2 && .... && conditionN) )
{
// first condition evaluating to false gets you here
// anything afterwards is not checked.
}
重新编码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
}
testStringHasValue返回什么?如果是布尔值,则只使用所有组合的返回值,如下所示:
boolean result = true;
result = result && Utility.testStringHasValue(txEmail.Text);
result = result && Utility.testStringHasValue(txFirstName.Text);
return result;
您使用异常的方式不是很好。它们不应该用于这种验证,并且只有当您实际抛出异常而不是onyl时,您到达catch的意图才会有效,因为它返回布尔值false。
try。。从资源角度来看,catch异常处理比简单的布尔检查更昂贵。从msdn站点重新:尝试。。catch:"在运行时捕获异常会产生额外的开销,而且可能比避免异常的预检查慢。"使用if..然后,如前所示。
您是否想过编写一个可重用的方法来检查传递给它的所有值是否为空?如果你在多个地方使用代码,这样的东西可能会节省大量时间:
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);