Вызов методов внутри if () - C#

У меня есть несколько методов, которые возвращают 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
}

Method2 () не нужно запускать, если Method1 () возвращает FALSE.

Дайте мне знать, что есть какие-либо проблемы с кодом выше.

спасибо.

EDIT: поскольку в коде не было ничего плохого, я приму самый информативный ответ ... добавлен комментарий для решения вопрос " новичок & &&"

10 ответов


я добавлю, что вы можете использовать & operator (вместо &&), чтобы гарантировать, что оба метода вызываются даже если левая сторона false, Если по какой-то причине в будущем вы хотите, чтобы избежать короткого замыкания.

обратное работает для | operator, где, даже если левое условие true, правое условие будет оценено также.


нет, нет ничего плохого в вызовах метода в условии if. На самом деле, это может быть отличный способ сделать ваш код более читаемым!

например, намного чище писать:

private bool AllActive()
{
    return x.IsActive && y.IsActive && z.IsActive;
}

if(AllActive())
{
    //do stuff
}

чем:

if(x.IsActive && y.IsActive && z.IsActive)
{
    //do stuff
}

как бы полезны они ни были, точки последовательности могут сбивать с толку. Если вы действительно не понимаете этого, неясно, что Method2 () может вообще не вызываться. С другой стороны, если бы вам нужно было вызвать оба метода, и они должны были бы вернуть true, что бы вы написали? Вы могли бы пойти с

bool result1 = Method1();
bool result2 = Method2();
if (result1 && result2)
{
}

или вы можете пойти с

if (Method1())
    if (Method2())
    {
    }

поэтому я думаю, что ответ на ваш вопрос ИМХО, нет, это не совсем ясно, что вы имеете в виду, хотя поведение будет то, что вы описывать.


Я бы рекомендовал его только в том случае, если методы являются чистыми (без побочных эффектов) функциями.


в то время как, как все говорят, нет ничего "плохого" в том, чтобы делать вещи таким образом, и во многих случаях вы делаете именно то, для чего был разработан язык.

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

Если короткое замыкание выражение имеет какой-то побочный эффект, оно может быть более читаемым для разделения операторов, строго с точки зрения обслуживания.


выглядит хорошо для меня, несколько предложений в блоке if () будет короткое замыкание, если предыдущее условие не выполняется.


там не должно быть никаких проблем.

нормальным поведением является то, что Method1() будет выполняться, и если это возвращает true Method2() будет выполняться, и в зависимости от того, что возвращает Method2 (), вы можете / не можете ввести оператор if ().

вот этот предполагает что компилятор генерирует код, который выполняется таким образом. Если вы хотите быть абсолютно точно этот Method2 () не выполняется, если Method1 () не возвращает true, вы можете написать его как это

if( Method1() )
{
  if( Method2() )
  {
    // do stuff if both methods returned TRUE 
  }
}

но я всегда замечал, что ваш код будет работать так, как ожидалось, поэтому это, вероятно, не нужно.


ничего плохого.

на самом деле...Я бы не назвал их Method1 и Method2. Что-то более описательное. Возможно, пассивное звучание тоже (например, StuffHasHappened или DataHasLoaded)


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

мой рекомендации являются:

  • если имена методов короткие, и их не так много, то это все хорошо.
  • если у вас слишком много операторов/вызовов методов внутри if утверждение, Вы, скорее всего, сравниваете более одного "набора" вещей. Разбейте эти "наборы" и введите временные переменная.
  • " слишком много " субъективно, но обычно больше, чем около 3
  • когда я говорю "имена методов короткие", я говорю не только об именах, но и о параметрах, которые они принимают. В основном усилия, необходимые для того, чтобы кто-то его прочитал. Например if( Open(host) ) меньше, чем if( WeCouldConnectToTheServer ). Общий размер всех этих предметов-это то, к чему он сводится.

лично я считаю

if(Method1() && Method2())
{
    // do stuff if both methods returned TRUE
}

быть плохой практикой. Да, он работает в текущей среде, но так же делает

if(Method1())
{
  if (Method2())
  {
    // do stuff if both methods returned TRUE
  }
}

но будет ли он работать во всех средах? Будут ли будущие, возможно, не Microsoft, компиляторы C# работать таким образом? Что делать, если ваша следующая работа включает в себя другой язык, где оба метода всегда будут называться? Я бы не стал полагаться на эту конкретную конструкцию не потому, что она неправильная, а потому, что она не решает никаких серьезных проблем, и она может стать неправильным в будущем