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

Sha*_*pta 3 .net c# operators conditional-operator

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

我想要一些类似的东西,如果fisrt函数返回true,那么它也应该调用next函数,依此类推.可以使用什么代替Or运算符来执行此操作.

    if (IsFieldEmpty(ref txtFactoryName, true, "Required") ||
        IsFieldEmpty(ref txtShortName, true, "Required") ||
        IsFieldEmpty(ref cboGodown, true, "Required"))
    { }
Run Code Online (Sandbox Code Playgroud)

编辑

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Hen*_*man 10

您可以将单个|用于OR:

 if (IsFieldEmpty(ref txtFactoryName, true, "Required") |
    IsFieldEmpty(ref txtShortName, true, "Required") |
    IsFieldEmpty(ref cboGodown, true, "Required"))
{ }
Run Code Online (Sandbox Code Playgroud)

双管||进行短路评估,单一版本进行 |全面评估.
同样的&&&.

请参阅MSDN参考.

编辑的回应:

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

  • 似乎很容易误读那段代码的意图. (6认同)
  • 错了,`|`和`&`运算符都是按位和逻辑运算符,具体取决于操作数,因此将它们用于逻辑运算也是完全合法的.是的,也没有短路.有关文档,请查看http://msdn.microsoft.com/en-us/library/6a71f45d(VS.71).aspx.如果它们只是按位,则表达式不会编译,因为没有自动转换为bool,所以if语句将是`if(int){}` (4认同)
  • 单个字符`|`是按位运算.你是对的,它不会短路,在这种情况下它会做你想要的,但是很糟糕. (2认同)

Ric*_*dle 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)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我强烈推荐这种方法.据推测,您希望避免短路,因为您的方法有副作用.这些方法不仅仅是为了查询状态而被调用.在这种情况下,将方法调用混合到if语句中隐藏了进行方法调用的全部意图. (7认同)
  • 调用函数IsFieldEmpty看起来像一个简单的bool测试似乎很重要.它表明这个功能正在做其他事情,比如记录正在进行的测试.就个人而言,我会选择更长的版本只是因为你不太可能欺骗你团队中任何其他开发人员发生的事情.单| 版本适合误解. (2认同)

Tre*_*vel 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))
{ }
Run Code Online (Sandbox Code Playgroud)

或类似的东西.

  • 这是[由Martin Fowler重构](http://martinfowler.com/books.html#refactoring)中描述的"与修饰符分离查询"重构的一个很好的例子. (2认同)