这是goto语句的好用吗?

时间:2011-11-18 10:28:49

标签: c# goto

我有一段C#代码,我使用goto语句。这是正确使用goto语句还是有更好的替代解决方案?

bool IsValid(TestObject aObject)
{
   bool aRetVal = false;

   if(condition here)
       goto exit;
   if(condition here)
       goto exit;
   if(condition here)
       goto exit;

   aRetVal = true;
   exit:
   return aRetVal;
}

我这样做的原因是因为我不希望在我的方法中有多个退出点。

7 个答案:

答案 0 :(得分:8)

不 - 改为使用return。为什么强迫某人阅读您的代码跳转到退出点并然后返回?你知道在这一点上你需要做的一切 - 所以最明智的解决方案是返回,IMO。

“没有多个出口点”的想法适用于您需要在函数退出时执行清理操作的语言,但在垃圾收集和finally块之间,这是毫无意义的在C#中适得其反。

如果符合条件,您想做什么?从方法返回。所以让你的代码说出来。无论你在哪里使代码说出你的意思,这都是件好事。不要让它变得比它需要的更复杂。

我假设你的真实情况比只是这些条件更复杂,否则我会使用类似Marcelo的答案,但可能写成:

return !(condition1 || condition2 || condition3);

答案 1 :(得分:3)

没有。写下这个:

return !(<condition 1> || <condition 2> || <condition 3>);

答案 2 :(得分:2)

  

我不想在我的功能中使用多个退出点。

请解释原因。

这不是goto的好用。它很容易被规避:

bool IsValid(TestObject aObject)
{
    bool aRetVal = false;

    if(condition here)
    {
        //don't goto exit; do other work instead
    }
    else if(condition here)
    {
        // don't goto exit; do other work instead
    }else if(condition here)
    {
        // don't goto exit; do other work instead
    }
    else
    {
        aRetVal = true;
    }

   return aRetVal;
}

或者,如果您的比例匹配时不需要执行其他工作,则可以轻松执行以下操作:

bool IsValid(TestObject aObject)
{
   return !((condition1 here) || (condition2 here) || (condition3 here));
}

答案 3 :(得分:2)

Goto很糟糕!这是非结构化的编程。为什么他们把它保存在C#中对我来说是一个谜......你可以在没有goto的情况下做得很好。

bool IsValid(TestObject aObject)
{
   return ((condition here) || (condition here) || (condition here));
}

更好,不是吗?

答案 4 :(得分:0)

不,这不是goto的好用,也没有必要。怎么样呢?

bool IsValid(TestObject aObject)
{
    if (condition here)
        return false;

    if (condition here)
        return false;

    if (condition here)
        return false;

    return true;
}

答案 5 :(得分:0)

我宁愿这样做:

bool IsValid(TestObject aObject)
{
   bool aRetVal = true;

   if(aRetVal && condition here)
       aRetVal = false;

   if(aRetVal && condition here)
       aRetVal = false;

   if(aRetVal && condition here)
       aRetVal = false;

   return aRetVal;
}

或者只是返回false;正如其他人所建议的那样。

答案 6 :(得分:0)

在您的具体情况下,goto不会澄清代码。当我阅读代码时,我必须阅读条件,找到goto标签并阅读标签下面的代码。这是一项很多工作,读者会很快累,会犯错误。

当我编写代码时,我会记住,它的阅读不仅仅是书面的。我试着照顾我心爱的读者:我认为 KISS (Keep It Simple,Supid)和对抗复杂性。

在书Code Complete, there's an article about the use of GOTO中。值得一读。