Проблема Double If Else в C#
-
06-07-2019 - |
Вопрос
Я постоянно пишу подобный код, как в примере ниже:
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
}
Или т.п.