Вызов методов внутри 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.

Сообщите мне, что с приведенным выше кодом возникла проблема.

Спасибо.

РЕДАКТИРОВАТЬ: поскольку с кодом все в порядке, я приму наиболее информативный ответ ... добавил комментарий, чтобы решить проблему "новичок & &&"

Ответов (10)

Решение

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

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

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

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

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

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

или ты мог бы пойти с

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

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

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

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

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

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

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

чем:

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

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

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

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

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

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

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

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

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

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

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

Мои рекомендации :

  • Если названия методов короткие и их не так много, то все хорошо.
  • Если у вас слишком много операторов / вызовов методов внутри 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
  }
}

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