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

C# 从交换机内部返回是否有效?,c#,C#,以下是我的代码: int getPos(string partOfSpeech) { var pos = 0; switch (partOfSpeech) { case "noun": pos = 1; break; case "verb": pos = 2; break; case "adjective":

以下是我的代码:

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;
}

如果可能的话,我想简化一下。对我来说,从交换机内部执行返回操作是否有效(合理)?

为了澄清
返回操作的作用:

:

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


因此
return
将返回到调用方法,在何处使用它并不重要。它也在
开关
语句中工作,即代替
中断
命令。

为了澄清
返回
的作用:

:

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


因此
return
将返回到调用方法,在何处使用它并不重要。它也在
开关
语句中工作,即代替
中断
命令。

技术上是的,您可以使用
返回
语句而不是
中断
。尽管这是一个简单的解决方案,但想象一下从长远来看,这是否是一个明智的决策

你为什么想要五份而不是一份?从函数中有一个退出点,然后有五个退出点,看起来要干净得多。另外,如果有人在查看您的代码时想知道该方法存在于何处,这会让人感到困惑。如果您真的想简化上述方法,您可能需要完全重写它,以降低方法的圈复杂度。所以,类似这样的东西可能是有效的:

// Probably somewhere at the beginning of the class as a private global field
private Dictionary<string, int> _partOfSpeechDict;
public yourClassConstructor()
{
    _partOfSpeechDict = new Dictionar<string, int>();
    _partOfSpeechDict.Add("noun", 1);
    _partOfSpeechDict.Add("verb", 2);
    _partOfSpeechDict.Add("adjective", 3);
    _partOfSpeechDict.Add("adverb", 4);
}

int getPos(string partOfSpeech)
{
    var pos = 5; // For 'other' or default in your case

    if (_partOfSpeechDict.ContainsKey(partOfSpeech)) 
    {
        pos = _partOfSpeechDict[partOfSpeech];
    }
    return pos;
}
//可能在类开头的某个地方作为私有全局字段
专用词典(peechdict的一部分),;
公共类构造函数()
{
_partOfSpeechDict=新字典();
_添加(“名词”,1);
_添加(“动词”,2);
_添加(“形容词”,3);
_添加(“副词”,4);
}
int getPos(语音的字符串部分)
{
var pos=5;//用于“其他”或您案例中的默认值
if(_partOfSpeechDict.ContainsKey(partOfSpeech))
{
pos=_部分语音信息[部分语音];
}
返回pos;
}

技术上是的,您可以使用
return
语句而不是
break
。尽管这是一个简单的解决方案,但想象一下从长远来看,这是否是一个明智的决策

你为什么想要五份而不是一份?从函数中有一个退出点,然后有五个退出点,看起来要干净得多。另外,如果有人在查看您的代码时想知道该方法存在于何处,这会让人感到困惑。如果您真的想简化上述方法,您可能需要完全重写它,以降低方法的圈复杂度。所以,类似这样的东西可能是有效的:

// Probably somewhere at the beginning of the class as a private global field
private Dictionary<string, int> _partOfSpeechDict;
public yourClassConstructor()
{
    _partOfSpeechDict = new Dictionar<string, int>();
    _partOfSpeechDict.Add("noun", 1);
    _partOfSpeechDict.Add("verb", 2);
    _partOfSpeechDict.Add("adjective", 3);
    _partOfSpeechDict.Add("adverb", 4);
}

int getPos(string partOfSpeech)
{
    var pos = 5; // For 'other' or default in your case

    if (_partOfSpeechDict.ContainsKey(partOfSpeech)) 
    {
        pos = _partOfSpeechDict[partOfSpeech];
    }
    return pos;
}
//可能在类开头的某个地方作为私有全局字段
专用词典(peechdict的一部分),;
公共类构造函数()
{
_partOfSpeechDict=新字典();
_添加(“名词”,1);
_添加(“动词”,2);
_添加(“形容词”,3);
_添加(“副词”,4);
}
int getPos(语音的字符串部分)
{
var pos=5;//用于“其他”或您案例中的默认值
if(_partOfSpeechDict.ContainsKey(partOfSpeech))
{
pos=_部分语音信息[部分语音];
}
返回pos;
}
有一个要求(由编译器强制执行),所有的
案例都必须结束。通常的方法是在
中断时结束它(如示例中所示),但也存在其他可能性,例如:

  • goto
    -显式跳转到另一个
    案例
  • 抛出一个异常
  • 返回
因此,是的,可以从case块内的函数返回。

有一个要求(由编译器强制执行),即所有的
case
都必须结束。通常的方法是在
中断时结束它(如示例中所示),但也存在其他可能性,例如:

  • goto
    -显式跳转到另一个
    案例
  • 抛出一个异常
  • 返回
因此,是的,可以从case块内的函数返回。

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;
    }
}
我认为这段代码可能也很有趣(在一行中)

或者,您可以声明一个枚举,并像这样使用它:

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;
}

我认为这段代码可能也很有趣(在一行中)

或者,您可以声明一个枚举,并像这样使用它:

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;
}

开关部分(即,案例块)的语句列表通常以
break
goto case
goto 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;
}

开关部分(即,案例块)的语句列表通常以
break
goto case
goto 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;
}

是的………是的,它是有效的,只要写上return“whatever”,我会尽量不养成使用switch语句的习惯,因为它们是一种很好的脱离实体的方法principles@Adwaenyth我不同意,当您有多个返回时,调试更容易,否则,您需要跟踪返回的某个变量,该变量可能会发生多次更改。@JamieR在复杂方法中有多个退出点,这使得在执行清理操作(如回滚)时很难断言