Использование Try Catch для поиска логического значения - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть несколько булевых проверок значений.Я хотел проверить ЛЮБОЕ из значений, возвращающих 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);

Ответы [ 9 ]

4 голосов
/ 28 февраля 2012

Не используйте исключения для этого сценария, когда генерируется исключение, это приводит к падению производительности.

Уже существует метод, позволяющий проверить, введена ли строка (String.IsNullOrEmpty)

Вы можете использовать оператор && (и) для проверки правильности всех полей.

Например:

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);
2 голосов
/ 28 февраля 2012

Если вы написали методы 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 раза в вашемпример.

0 голосов
/ 28 февраля 2012

Задумывались ли вы над тем, чтобы написать повторно используемый метод, чтобы проверить, что все значения, переданные ему, не пусты? Примерно так может сэкономить время, если вы используете код в нескольких местах:

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);
0 голосов
/ 28 февраля 2012

try..catch обработка исключений дороже, чем простая логическая проверка, с точки зрения ресурсов.С сайта msdn re: try..catch: «Ловля исключений во время выполнения создает дополнительные издержки и, вероятно, будет медленнее, чем предварительная проверка, чтобы избежать исключений».Используйте if..then, как показано ранее.

0 голосов
/ 28 февраля 2012

Что возвращает testStringHasValue? если логическое значение, то вместо этого просто используйте все объединенные возвращаемые значения, например:

boolean result = true;
result = result && Utility.testStringHasValue(txEmail.Text); 
result = result && Utility.testStringHasValue(txFirstName.Text);
return result;

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

0 голосов
/ 28 февраля 2012

Перекодируйте ваш 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
}
0 голосов
/ 28 февраля 2012
if ( !(condtion1 && condition2 && .... && conditionN) )
{
  // first condition evaluating to false gets you here
  // anything afterwards is not checked.
}
0 голосов
/ 28 февраля 2012

Это потому, что возвращение 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");
}
0 голосов
/ 28 февраля 2012
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;
}

Обработка исключений не должна использоваться в качестве логики управления.Это запутывает цель.

...