Двойной, если еще проблема в C # - PullRequest
3 голосов
/ 23 октября 2009

Я постоянно нахожу, что пишу подобный код, как в примере ниже:

if (object["Object Name"] != null) {
    if (object["Object Name"] == "Some Value") {
        // Do Statement A
    } else {
        // Do Statement B
    }
} else {
    // Do Statement B
}

Проблема здесь в том, что я много проверяю, является ли объект нулевым или нет, и затем я могу проверить его на предмет его фактического содержания.

«Оператор B» всегда один и тот же, и в моем случае это обычно оператор SQL.

Должен быть лучший способ обойти это?

Спасибо
Стивен

Ответы [ 5 ]

23 голосов
/ 23 октября 2009

В C # имеется короткое замыкание, поэтому вы можете сделать:

if(null != object && object.name == foo)
  do A
else
  do B

C # всегда сначала вычисляет первое выражение в условном операторе, и если это не удается, он ничего не пробует в этой части оператора.

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

if(trivial comparison && trivial comparison && REALLY EXPENSIVE OPERATION)

Теперь будет выполняться только дорогая операция в качестве крайней меры.

1 голос
/ 23 октября 2009

Почему двойная проверка? Конечно, этого будет достаточно:

if(object["Object Name"] == "Some Value") {
    // Do statement A
} else {
    // Do statement B
}

Я вроде вижу, к чему вы клоните с помощью проверки на ноль, но конкретный пример, который вы приводите, не требует этого.

РЕДАКТИРОВАНИЕ: Теперь, если вы написали это вместо:

if (object != null) {
    if (object["Object Name"] == "Some Value") {
        // Do Statement A
    } else {
        // Do Statement B
    }
} else {
    // Do Statement B
}

тогда решение будет:

if(object != null && object["Object Name"] == "Some Value") {
    // Do Statement A
} else {
    // Do Statement B
}
1 голос
/ 23 октября 2009

Я думаю, что если переписать if-then-else, это будет выглядеть лучше из-за одного B-оператора.

if ((object["Object Name"] != null) && (object["Object Name"] == "Some Value")) 
{
    // Do Statement A
} 
else 
{
    // Do Statement B
}
1 голос
/ 23 октября 2009

Так как C # делает короткое замыкание, да. Попробуйте это:

if (object["Object Name"] != null && object["Object Name"] == "Some Value") 
{
    // Do Statement A
} 
else 
{
    // Do Statement B
}
0 голосов
/ 23 октября 2009

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не используется общий метод короткого замыкания.

Что ж, вы можете создать отдельную функцию для выполнения поиска, особенно если запрос остается тем же. Так что-то вроде этого: (входящий псевдокод)

private bool IsNullCheck(string objectName)
{
  if (object["Object Name"] != null)
     return false;
  else
     // statement B
}

if (!IsNullCheck("Object Name") && if(object["Object name"] == "Value") {
   // stuffs

} 
else 
{
        // Do Statement B
}

или тому подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...