Вызов методов внутри if() - С#
У меня есть несколько методов, которые возвращают bool в зависимости от их успеха, есть ли что-то неправильное в вызове этих методов внутри IF()?
//&& makes sure that Method2() will only get called if Method1() returned true, use & to call both methods
if(Method1() && Method2())
{
// do stuff if both methods returned TRUE
}
Метод2() не нужно запускать, если Method1() возвращает FALSE.
Сообщите мне о проблемах с приведенным выше кодом.
спасибо.
РЕДАКТИРОВАТЬ:, так как в коде не было ничего плохого, я приму самый информативный ответ... добавил комментарий, чтобы решить "новичок и & &". вопрос
Ответы
Ответ 1
Я добавлю, что вы можете использовать & operator
(в отличие от &&
), чтобы гарантировать, что оба метода будут вызваны, даже если левая сторона false
, если по какой-либо причине в будущем вы хотите избежать короткого замыкания.
Обратный работает для | operator
, где даже если левое условие оценивается как true
, будет также оценено правое условие.
Ответ 2
Нет, нет ничего плохого в вызовах метода в условии if. На самом деле, это отличный способ сделать ваш код более удобочитаемым!
Например, для записи намного проще писать:
private bool AllActive()
{
return x.IsActive && y.IsActive && z.IsActive;
}
if(AllActive())
{
//do stuff
}
чем:
if(x.IsActive && y.IsActive && z.IsActive)
{
//do stuff
}
Ответ 3
Насколько они полезны, точки последовательности могут вводить в заблуждение. Если вы этого не понимаете, неясно, что метод2() вообще не может быть вызван. Если, с другой стороны, вам нужны БОЛЬШИЕ методы, которые нужно называть, и им нужно было вернуть true, что бы вы написали? Вы можете пойти с
bool result1 = Method1();
bool result2 = Method2();
if (result1 && result2)
{
}
или вы можете пойти с
if (Method1())
if (Method2())
{
}
Итак, я думаю, что ответ на ваш вопрос IMHO есть, нет, это не совсем ясно, что вы имеете в виду, даже если поведение будет тем, что вы описываете.
Ответ 4
Я бы рекомендовал, только если методы являются чистыми (без побочных эффектов).
Ответ 5
Пока, как говорят все, нет ничего "неправильного" в этом, и во многих случаях вы делаете именно то, для чего был разработан язык.
Помните, однако, что для удобства поддержки, если Method2 имеет побочные эффекты (то есть он меняет состояние somethings), может быть не очевидно, что эта функция не называется (хороший программист обычно знает, но даже у хороших программистов иногда есть мозги).
Если выражение с коротким замыканием имеет какой-то побочный эффект, может быть более читаемым для разделения операторов, строго с точки зрения обслуживания.
Ответ 6
Похоже на меня, многократные предложения в блоке if() будут короткими, если более раннее условие терпит неудачу.
Ответ 7
Не должно быть никаких проблем.
Нормальное поведение заключается в том, что будет выполняться Method1(), и если это вернет true, метод Method2() будет выполняться, и в зависимости от того, что возвращает Method2(), вы можете/не можете ввести оператор if().
Теперь это предполагает, что компилятор генерирует код, который выполняется таким образом. Если вы хотите быть абсолютно уверенным, что Method2() не выполняется, если Method1() не возвращает true, вы можете записать его так:
if( Method1() )
{
if( Method2() )
{
// do stuff if both methods returned TRUE
}
}
Но я всегда замечал, что ваш код будет работать так, как ожидалось, поэтому это, вероятно, не нужно.
Ответ 8
Неправильно.
На самом деле... Я бы не назвал их Method1 и Method2. Что-то более описательное. Может быть, и пассивное звучание (например, StuffHasHappened или DataHasLoaded)
Ответ 9
Выглядит хорошо для меня, но есть некоторые предостережения... Это НЕ тот тип вещей, где применяются правила одеяла.
Мои рекомендации:
- Если имена методов коротки, и их не так уж много, тогда все это хорошо.
- Если у вас слишком много операторов/вызовов методов внутри оператора
if
, вы, скорее всего, сравниваете более одного "набора" вещей. Разбейте эти "наборы" и введите временные переменные.
- "Слишком много" субъективно, но обычно больше, чем около 3
- Когда я говорю "имена методов коротки", я говорю не только об именах, но и о параметрах, которые они принимают. В основном усилия, требуемые для кого-то, чтобы прочитать его. Например,
if( Open(host) )
короче if( WeCouldConnectToTheServer )
. Общий размер всех этих элементов - это то, к чему оно сводится.
Ответ 10
Лично я бы рассмотрел
if(Method1() && Method2())
{
// do stuff if both methods returned TRUE
}
- плохая практика. Да, он работает в текущей среде, но делает
if(Method1())
{
if (Method2())
{
// do stuff if both methods returned TRUE
}
}
Но будет ли он работать во всех средах? Будут ли работать будущие, возможно, не Microsoft, компиляторы С#? Что делать, если ваша следующая работа связана с другим языком, на котором всегда будут вызываться оба метода? Я бы не стал полагаться на эту конкретную конструкцию не потому, что это неправильно, а потому, что она не решает какой-либо серьезной проблемы, и она может стать неправильной в будущем