Использование ключевого слова возврата в блоке кода - PullRequest
1 голос
/ 23 февраля 2009

В чем разница между высказыванием:

if (abc == "a")
{
// do something here...
return;
}

и тоже самое, что и выше, но без ключевого слова return?

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

Спасибо

Ответы [ 9 ]

13 голосов
/ 23 февраля 2009

«возврат» выходит из функции , а не только вмещающего кодового блока. Так что, если ваш блок кода был в контексте функции, вот так (я не знаю C #, поэтому я использую синтаксис Java):

int thisIsAFunction(int a) {
    if (abc == "a")
    {
        // do something here...
        return 1;
    }
    // do something else here...
}

если abc == "a", то «сделать что-то еще здесь» не будет запущено. Но если вы удалите оператор return внутри блока if, он запустится.

3 голосов
/ 23 февраля 2009

* MSDN 1002 *

Оператор return завершает выполнение метода, в котором он появляется, и возвращает управление вызывающему методу. Он также может возвращать необязательное значение. Если метод имеет тип void, оператор return может быть опущен.

Пример

//this would do nothing
public void method()
{
   return;
}


 //this would return true
 //notice the return type of bool this means
 //the method expects a true\false value
public bool method2()
{
   return true;
}

public void test()
{
    if(method2())
        method()
}

Теперь, если вы запустите test method2 всегда вернет true, а method1 просто завершит свою обработку

3 голосов
/ 23 февраля 2009

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

2 голосов
/ 23 февраля 2009

Оператор return завершает текущий метод, а не только блок кода (для / while / if / etc). Так что это полезно для ситуаций, подобных следующим:

public void MyMethod(object myObject)
{
    if (myObject == null)
    {
        return;  // exits method.
    }

    // do something with myObject
}

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

1 голос
/ 23 февраля 2009

В операторе цикла или регистра вы можете использовать break для достижения этого результата. Это не работает, если операторы или блоки кода вообще.

И да, return завершает функцию включения.

1 голос
/ 23 февраля 2009

В вашем случае нет - но если у вас был другой код после вашего оператора if, который вы хотели запустить, только если ваш оператор был ложным (например, если abc != "a"), то return позволяет вам обойти это и выйдите из функции / метода.

0 голосов
/ 23 февраля 2009

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

0 голосов
/ 23 февраля 2009

Да, ваш метод не имеет типа возврата в этом случае. например,

public void Foo
{
 if (abc == "a")
 {
  // do something here...
  return;
 }
 // some other code
}

То есть, если abd = "a", выйдите из метода, чтобы другой код не был выполнен.

0 голосов
/ 23 февраля 2009

Выполнение оператора return заставит выполнение выпрыгнуть из метода. Без возврата он просто продолжит выполнение следующего оператора.

...