从交换机内部返回是否有效?

时间:2016-06-01 12:50:45

标签: c#

这是我的代码:

int getPos(string partOfSpeech)
{
    var pos = 0;
    switch (partOfSpeech)
    {
        case "noun":
            pos = 1;
            break;
        case "verb":
            pos = 2;
            break;
        case "adjective":
            pos = 3;
            break;
        case "Adverb":
            pos = 4;
            break;
        default:
            pos = 5;
            break;
    }
    return pos;
}

如果可能的话,我想简化一下。从交换机内部返回是否对我有效(且明智)?

5 个答案:

答案 0 :(得分:2)

从技术上讲,您可以使用val m : N = new N语句代替return。虽然这是一个简单的解决方案,但想象一下,从长远来看,这是否是一个明智的决定。

为什么你想要五次而不是一次?从函数中有一个退出点然后五个看起来更清晰。此外,如果您想要简化上述方法,您可能需要完全重写它以降低方法的圈复杂度,这对于查看您的代码的人来说会很困惑。所以,这样的事情可能是有效的:

break

答案 1 :(得分:1)

int getPos(string partOfSpeech)
{
    switch (partOfSpeech)
    {
        case "noun":
            return 1;
        case "verb":
            return 2;
        case "adjective":
            return 3;
        case "Adverb":
            return 4;
        default:
            return 5;
    }
}

我认为这段代码也很有意思(在一条线上)。

int getPos(string partOfSpeech)
{
    return partOfSpeech == "noun" ? 1 : partOfSpeech == "verb" ? 2 : partOfSpeech == "adjective" ? 3 : partOfSpeech == "Adverb" ? 4 : 5;
}

或许你可以声明一个枚举并像这样使用它:

enum partOfSpeech
{
    noun = 1,
    verb = 2,
    adjective = 3,
    Adverb = 4
}

你可以通过枚举:

int getPos(partOfSpeech p)
{
    return (int)p;
}

或字符串:

int getPos(string p)
{
    partOfSpeech pos;
    Enum.TryParse(p, out pos);
    return (int)pos == 0 ? 5 : (int)pos;
}

答案 2 :(得分:0)

澄清return做了什么:

return (C# Reference)

  

return语句终止它出现的方法的执行,并将控制权返回给调用方法。它还可以返回一个可选值。如果方法是void类型,则可以省略return语句。

因此return将返回调用方法,并且它在何处使用并不重要。它也适用于switch语句,即代替break命令。

答案 3 :(得分:0)

切换部分的语句列表(即大小写块)通常以breakgoto casegoto default结尾。但是,允许任何使交换机部分的端点不可达的构造。以下是有效的:

switch (id)
{  
    case 1:
        // Some processing
        throw new ArgumentException();
    case 2:         
        // Some processing
        return;
    case 3:
        // Some processing
        goto case 4;
    case 4:
        // Some processing
        goto default;
    default:
        // Some processing
        break;
}

答案 4 :(得分:-1)

有一个要求(由编译器强制执行)所有case肯定会结束。通常的方法是在break上结束它(如在您的示例中),但存在其他可能性,例如:

  • goto - 明确跳转到另一个case
  • throw例外
  • return

所以是的,可以从案例块中的函数返回。