我对值进行了几次bool检查。我想检查任何值返回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);
答案 0 :(得分:4)
不要对该场景使用异常,当抛出异常时会出现性能损失。
还有一种方法可用于检查是否输入了字符串(String.IsNullOrEmpty)
您可以使用&amp;&amp; (和)运算符验证所有字段是否有效。
例如:
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);
答案 1 :(得分: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
除非左侧返回&&
,否则 true
将不会调用评估右侧,因此Utility.testStringHasValue
实际上只会在您的示例中调用3次。
答案 2 :(得分:0)
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;
}
不应将异常处理用作控制逻辑。它模糊了目的。
答案 3 :(得分:0)
那是因为返回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");
}
答案 4 :(得分:0)
if ( !(condtion1 && condition2 && .... && conditionN) )
{
// first condition evaluating to false gets you here
// anything afterwards is not checked.
}
答案 5 :(得分:0)
重新编码您的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
}
答案 6 :(得分:0)
testStringHasValue返回什么?如果是布尔值,则只需使用所有组合返回值,如下所示:
boolean result = true;
result = result && Utility.testStringHasValue(txEmail.Text);
result = result && Utility.testStringHasValue(txFirstName.Text);
return result;
您使用异常的方式不是很好。它们不应该用于这种验证,并且只有当你因为它返回一个布尔值假值而不是onyl而抛出异常时,你才有意达到catch。
答案 7 :(得分:0)
try..catch异常处理比资源方面的简单布尔检查更昂贵。从msdn站点re:try..catch:“在运行时捕获异常会产生额外的开销,并且可能比预检查要慢,以避免异常。” 使用if..then如前所示。
答案 8 :(得分:0)
您是否考虑过编写一个可重用的方法来检查传递给它的所有值是否为空?如果您在多个地方使用代码,这样的事情可能会节省大量时间:
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);