我有一段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;
}
我这样做的原因是因为我不希望在我的方法中有多个退出点。
答案 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中。值得一读。