在使用或运算符时调用所有3个函数,即使在返回true之后也是如此

时间:2010-04-19 13:03:42

标签: c# .net operators conditional-operator

我在我的代码中调用了三个函数,我想验证我的一些字段。 当我尝试使用下面给出的代码时。它仅检查第一个值,直到它得到错误的结果。

我想要一些类似的东西,如果fisrt函数返回true,那么它也应该调用next函数,依此类推。可以用什么来代替Or Operator来做到这一点。

    if (IsFieldEmpty(ref txtFactoryName, true, "Required") ||
        IsFieldEmpty(ref txtShortName, true, "Required") ||
        IsFieldEmpty(ref cboGodown, true, "Required"))
    { }

修改

public bool IsFieldEmpty(ref TextBox txtControl, Boolean SetErrorProvider,string msgToShowOnError)
{
    ErrorProvider EP = new ErrorProvider();
    if (txtControl.Text == string.Empty)
    {
        EP.SetError(txtControl, msgToShowOnError);
        return true;
    }
    else
    {
        EP.Clear();
        return false;
    }
}

请评论,这个方法是否可以使用ref变量作为参数之一。

我正在winform检查onSubmit事件的验证。

5 个答案:

答案 0 :(得分:10)

您可以将单个|用于OR:

 if (IsFieldEmpty(ref txtFactoryName, true, "Required") |
    IsFieldEmpty(ref txtShortName, true, "Required") |
    IsFieldEmpty(ref cboGodown, true, "Required"))
{ }

双管||正在执行short-circuit evaluationsingle version |会进行全面评估。
&&&也是如此。

请参阅MSDN reference

修改

的回应
  1. txtControl前面不需要'ref',删除它会对解决你的方法的批评有很大的帮助。 IsFieldEmpty不对txtControl进行任何更改。您可以重命名为CheckFieldEmpty以进一步改进它。
  2. 在这个方法中创建一个ErrorProvider实例很奇怪,这样做有用吗?表格上通常应该有一个(永久)实例。您可能希望此方法独立于Form,因此只需添加一个EP作为参数。它可以替换SetErrorProvider,可以检查EP参数是否为null。 O,并将EP.Clear();替换为Ep.SetErrortxtControl, "");

答案 1 :(得分:10)

明确说明你在做什么:

bool isFactoryNameEmpty = IsFieldEmpty(ref txtFactoryName, true, "Required");
bool isShortNameEmpty = IsFieldEmpty(ref txtShortName, true, "Required");
bool isGodownEmpty = IsFieldEmpty(ref cboGodown, true, "Required");
if (isFactoryNameEmpty || isShortNameEmpty || isGodownEmpty)
{
    // ...
}

(另外,我假设您需要调用所有三个函数,因为它们有副作用?在这种情况下IsFieldEmpty是一个非常糟糕的名称。)

答案 2 :(得分:6)

你为什么需要它?我能想到的唯一原因是你的“IsFieldEmpty”函数也在对数据进行一些计算或更改,这让我很担心。名为“IsFieldEmpty”的函数实际上不应该执行任何其他操作。

在这种情况下,从可用性/可维护性的角度来看,你最好用:

SomeFieldMaintenance(ref txtFactoryName, true, "Required")
SomeFieldMaintenance(ref txtShortName, true, "Required")
SomeFieldMaintenance(ref cboGodown, true, "Required")
if (IsFieldEmpty(txtFactoryname) ||
    IsFieldEmpty(txtShortName) ||
    IsFieldEmpty(cboGodown))
{ }

或类似的东西。

答案 3 :(得分:0)

您所看到的被称为C#中的短路。如果第一个表达式失败,那么它将不会费心去尝试下一个表达式,因为最终结果已经确定。

http://johnnycoder.com/blog/2006/08/02/short-circuit-operators-in-c/

你应该|而不是||得到你的结果。

 if (IsFieldEmpty(ref txtFactoryName, true, "Required") |
        IsFieldEmpty(ref txtShortName, true, "Required") |
        IsFieldEmpty(ref cboGodown, true, "Required"))

C#运营商 http://msdn.microsoft.com/en-us/library/6a71f45d.aspx

||运营商。 http://msdn.microsoft.com/en-us/library/6373h346.aspx

|运营商。 http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx

答案 4 :(得分:0)

到目前为止,答案假设您要验证所有字段,即使其中一个字段失败也是如此。您的原始问题中没有明确这一假设。因此,如果您不介意在一个字段失败时停止验证,那么最简单的解决方案是使用&&运算符而不是||。这将实现您的既定目标:“如果第一个函数返回true,那么它也应该调用next函数,依此类推”。但是,如果第一个函数返回false,则不会调用任何其他函数,这可能不是您想要的。