Подтвердить что ты не робот

Имеет ли значение производительность, если есть "else" после первого "возврата"?

Теперь я видел два разных способа создания логического метода возврата:

bool Case1()
{
    if (A)
        return true;
    else
        return false;
}
bool Case2()
{
    if (A)
        return true;
    return false;
}

Какой из них быстрее? Имеет ли смысл писать else только для того, чтобы сохранить строку, сделать ее более ясной или есть незначительное увеличение производительности?

4b9b3361

Ответ 1

Нет.

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

.method private hidebysig instance bool  Case1() cil managed
{
  // Code size       9 (0x9)
  .maxstack  1
  .locals init ([0] bool CS$1$0000,
           [1] bool CS$4$0001)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.1
  IL_0003:  ldc.i4.1
  IL_0004:  stloc.0
  IL_0005:  br.s       IL_0007
  IL_0007:  ldloc.0
  IL_0008:  ret
} // end of method Program::Case1

Посмотрите на эти фрагменты кода для своих выступлений;

http://ideone.com/8Sc7Ho → Память: 33856 kB

http://ideone.com/MrnaAl → Память: 33808 kB

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

Ответ 2

Компилятор С# должен генерировать тот же IL для этих двух случаев, поэтому не должно быть разницы в производительности. Вы всегда можете просмотреть сгенерированный ИЛ, если вам интересно, что на самом деле происходит (попытка научить ловить рыбу).

IMHO, Case1 легче читать, что чего-то стоит. Мой второй выбор был бы return A; (как упоминалось в некоторых других ответах). Если A не является bool, хотя есть неявное преобразование, которое может быть запутанным в некоторых случаях.

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

Ответ 3

Не будет (незначительной) разницы. С точки зрения кодирования вы действительно должны просто делать:

return A;

Но если предположить, что код был только для примера, я бы предложил:

bool Case3()
{
    bool retValue;
    if (A)
    {
        retValue = true;
    } 
    else
    { 
        retValue = false;
    }
    return retValue;
}

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

Ответ 4

Производительность одинакова. С точки зрения хорошей практики кодирования, предпочитайте последнюю, так что ясно, что функция всегда возвращает действительное значение.

Ответ 5

Они одинаковы.

Если A является ложным, в обоих случаях произойдет переход к оператору return false.