C# 使用从if转到while

C# 使用从if转到while,c#,goto,C#,Goto,如何停止在此处使用goto: if(true) { goto ln1; } DialogResult b=DialogResult.Yes; while(b==DialogResult.Yes){ //Stuff ln1: Function(); } 因为从一个作用域到另一个作用域使用goto显然是不允许的(它给出了一个错误)。 那么我能做些什么呢?我需要进入第二行代码,而不是第一行。不要使用goto标签转到使您的代码非常复杂!我认为你必须重新思考你的课程设计和你的

如何停止在此处使用
goto

if(true)
{
    goto ln1;
}
DialogResult b=DialogResult.Yes;
while(b==DialogResult.Yes){
    //Stuff
    ln1: Function();  
}
因为从一个作用域到另一个作用域使用goto显然是不允许的(它给出了一个错误)。
那么我能做些什么呢?我需要进入第二行代码,而不是第一行。

不要使用
goto
标签<代码>转到使您的代码非常复杂!我认为你必须重新思考你的课程设计和你的函数工作流程。
非常有用的链接:


如果您想在不进行初始条件检查的情况下进入循环,请使用
do。。。而
循环

例如:

DialogResult b;
do {
   b = ShowDialog(myYesNoDialog);
} while(b == DialogResult.Yes);
如果要根据条件使用初始检查或不使用初始检查,请使用布尔变量:

bool skipCondition = (some condition);
DialogResult b = DialogResult.Yes;
while (skipCondition || b == DialogResult.Yes) {
   skipCondition = false;
   b = ShowDialog(myYesNoDialog);
}

似乎是这样的:

DialogResult b=...; // must be initialized - it's not correct to skip that

if(true)
{
    // goto ln1;
} else {
    b=DialogResult.Yes;
}
do
{
  /*ln1:*/ Function();
}
while(b==DialogResult.Yes); 

你意识到你的代码跳过了很多行,所以程序实际上不会编译,让它运行? 你写的和我写的一样

    do
{
    Function();
}while(b==DialogResult.Yes)
要让它工作,你需要执行

DialogResult b = DialogResult.Yes;

首先

你为什么要在这里使用
goto
?如果没有它,它似乎在做同样的事情。你不应该,永远,永远,永远,永远(除非在某些特殊情况下)需要在代码中使用goto。当然,您的示例应该是可重构的,无需goto即可工作。goto对调试来说可能有点痛苦-相信我,在QuickBasic的日子里,我已经去过很多次了。我不知道C的语法中仍然有goto。这毫无意义,因为
Function()
b
之间没有任何联系。另外,始终发布准确的错误消息。goto没有任何东西可以打破“OOP规则”-goto是一种流量控制结构。OOP是一种编码范式。这两件事真的毫无关系。避免
goto
的原因是,阅读代码与
goto
容易混淆。请参阅,有时,代码> Goto 比 Buffy>代码更可读。@ USER3805967我把你链接到的是Dijkstra的论文(也许你应该考虑阅读它?)OOP讨论对象、对象之间的交互以及程序通信应该如何进行
goto
是一个流控制结构,它是语法的一部分,与OOP的好坏无关。声称它确实表明对什么是编码范式、什么是语言语法(以及在本例中这两者是如何联系的)缺乏基本理解。考虑修改你的答案有意义。也许我的英文描述真的很混乱。因为我们同意你最后的话。啊,太好了!然后,请考虑修改你的答案,删除有关“打破OOP”的无关部分。@爱德华德卡拉克:如果你想在没有初始检查的情况下进入循环,那么你就不需要任何东西,而不是<代码> Goto ,<代码>…而循环正是这样做的。如果您想使用初始检查或不使用初始检查,取决于条件,我在上面添加了一个替代方法。
DialogResult b = DialogResult.Yes;