我有一个问题,即我在表单中实施了大约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);
}
}
使用上面的代码作为示例,如果IsAAAValid()
返回false,则不执行第二个方法,因此未验证其中的数据,如果发现多个错误,则会导致错误的对话框。
谢谢!
答案 0 :(得分:8)
这称为“短路评估”,您可以阅读here,这是C#编程语言通常需要的功能。你可以用这样的东西解决它:
bool avalid = IsAAAValid();
bool bvalid = IsBBBValid();
if (avalid && bvalid)
{
//Continue and submit data
}
这将保证两种方法都能运行。
作为旁注,为了清楚您的代码,我建议您重命名验证方法,以表示它们有副作用。也就是说,它们不仅仅是简单地返回数据的状态;他们实际上有可能修改状态。这就是为什么在这种情况下短路评估会引起问题的原因。
答案 1 :(得分:6)
正如adv12
所回答的那样,这称为短路评估,但也可以替代他重构代码的方式。
有两个布尔和运算符:
&&
- 短路评估&
- 完整评估所以你可以简单地切换到使用&
来调用这两种方法:
if (IsAAAValid() & IsBBBValid())
^
|
+-- only one &, not two &&
现在,我已经说过,我个人会按照adv12的说法编写代码,因为这样可以更容易阅读代码,而不是很容易发现仅使用&
的代码,但我认为我会发布完整的答案。
答案 2 :(得分:4)
如果任何方法返回false,您可以简单地调用每个方法并将布尔值设置为false。最后,您可以检查此布尔值并显示错误消息。
bool isValid = true;
if(!IsValidA()) isValid = false;
if(!IsValidB()) isValid = false;
if(!IsValidC()) isValid = false;
if(!IsValidD()) isValid = false;
if(!IsValidE()) isValid = false;
if(!isValid)
MessageBox.Show("Global validation error message");
但是,我更喜欢使用List<string>
积累错误消息并在最后打印所有内容的更好方法
List<string> errors = new List<string>();
if(!IsValidA()) errors.Add("Fail on IsValidA");
if(!IsValidB()) errors.Add("Fail on IsValidB");
if(!IsValidC()) errors.Add("Fail on IsValidC");
if(!IsValidD()) errors.Add("Fail on IsValidD");
if(!IsValidE()) errors.Add("Fail on IsValidE");
if(errors.Count > 0)
{
string message = string.Join(Environment.NewLine, errors.ToArray());
MessageBox.Show("Validation errors found:" + Environment.NewLine + message);
}
我认为从用户的角度来看这是更好的,因为您可以告诉她/他在单条消息中发现的问题并避免在您告诉用户有关单个问题时发生的可怕用户体验,用户修复了问题只能与另一个问题的另一个错误消息一起被授予。