Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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
}

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

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

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
}

Или т.п.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top