Вызов всех 3-х функций во время использования или оператора даже после возврата true в результате - PullRequest
3 голосов
/ 19 апреля 2010

Я вызываю три функции в моем коде, где я хочу проверить некоторые из моих полей. Когда я пытаюсь работать с кодом, приведенным ниже. Он проверяет только первое значение, пока не получит ложный результат.

Я хочу что-то подобное, если функция fisrt возвращает true, то она также должна вызывать функцию next и так далее. Что можно использовать вместо оператора Or для этого.

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

EDIT

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 в качестве одного из параметров.

Я проверяю событие onSubmit для проверки в winform.

Ответы [ 5 ]

10 голосов
/ 19 апреля 2010

Объясните, что вы делаете:

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 - это действительно плохое имя.)

10 голосов
/ 19 апреля 2010

Вы можете использовать один | для ИЛИ:

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

Двойная труба || выполняет оценку короткого замыкания , одиночная версия | выполняет полную оценку.
То же самое для && и &.

См. Ссылка MSDN .

Ответ на Редактировать :

  1. Нет необходимости в 'ref' перед txtControl, и удаление этого будет иметь большое значение в критике вашего подхода здесь. IsFieldEmpty не вносит изменений в txtControl. Вы можете переименовать в CheckFieldEmpty, чтобы немного улучшить его.
  2. Странно, что вы создаете экземпляр ErrorProvider внутри этого метода, это работает вообще? Обычно в Форме должен быть один (постоянный) экземпляр. Возможно, вы хотите, чтобы этот метод не зависел от формы, поэтому просто добавьте EP в качестве параметра. Он может заменить SetErrorProvider, вы можете проверить параметр EP на ноль. O и замените EP.Clear(); на Ep.SetErrortxtControl, "");
6 голосов
/ 19 апреля 2010

Зачем вам это нужно? Единственная причина, по которой я могу думать, заключается в том, что ваша функция IsFieldEmpty также выполняет некоторые вычисления или изменения данных, и это меня беспокоит. Функция с именем «IsFieldEmpty» действительно не должна делать ничего другого.

В этом случае, с точки зрения удобства использования / ремонтопригодности, вам будет лучше:

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

Или что-то в этом роде.

0 голосов
/ 19 апреля 2010

Ответы до сих пор предполагали, что вы хотите проверить все поля, даже если одно из них не выполнено. Это предположение не является явным в вашем первоначальном вопросе. Так что, если вы не возражаете против остановки проверки при сбое одного поля, тогда самое простое решение - использовать оператор && вместо ||. Это достигнет вашей заявленной цели: «если первая функция возвращает true, то она также должна вызывать следующую функцию и так далее». Однако, если первая функция возвращает false, то никакие другие функции не будут вызваны, что может быть не тем, что вы хотите.

0 голосов
/ 19 апреля 2010

То, что вы видите, называется коротким замыканием в 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

...