Общий вопрос о множественном возврате в C # - PullRequest
3 голосов
/ 16 декабря 2010

Как вернуть значение, если мне не нужно нажимать block2.

Это имеет смысл или нет? Я думаю, что я не должен использовать multi return, но я не могу заменить его на break. Нет замкнутого контура, из которого можно разорвать или продолжить .

public EnResult MyFun()
{
    bool bRet = default;

    // block1 . higher priority than block2.
    if (true)
    {
    // if bRet = true_1, not need hit block2. That's why I want to nested my code with multi *return*
        return bRet = true_1;  
    }
    else
    {
        // do nothing
    }

    // block2
    if (true)
    {
        return bRet = true_2;
    }
    else
    {
        // do nothing
    }

    return bRet;
}

public enum EnResult
{
    true_1,
    true_2,
    false_1,
    false_2,
    default,
}

Ответы [ 2 ]

10 голосов
/ 16 декабря 2010

Использование нескольких операторов return для каждого метода вовсе не является плохим стилем кодирования.Ограничение себя одним оператором возврата имеет смысл в C, где вам может потребоваться goto некоторый общий код очистки, который освободит указатели и т. Д., А затем вернуть значение, которое вы сохранили в переменной.Но в C # это не обязательно.

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

1 голос
/ 16 декабря 2010

Если вы не хотите использовать «множественный возврат»:

public EnResult MyFun()
{
    // I changed 'default' to 'None' because I wasn't sure if it compiled
    EnResult result = EnResult.None;

    // block1 . higher priority than block2.
    if (true)
    {
        result = EnResult.true_1;
    }
    else
    {
        // do nothing
    }

    // block2
    if (result == EnResult.None)
    {
        if (true)
        {
            result = EnResult.true_2;
        }
        else
        {
            // do nothing
        }
    }

    return result;
}

public enum EnResult
{
    None,  
    true_1,
    true_2,
    false_1,
    false_2,

}

Я бы предпочел использовать несколько операторов возврата (ваш исходный код).Так гораздо понятнее ИМО.

...