每个人都知道Dijkstra 给编辑的信件:转到被认为有害的声明(也就是这里 .html脚本和这里的 .pdf)并且从那时起就有一个强大的推动,尽可能避开goto声明.虽然可以使用goto来生成不可维护的,庞大的代码,但它仍然保留在现代编程语言中.甚至Scheme中的高级连续控制结构也可以被描述为复杂的goto.
什么情况下可以使用goto?什么时候最好避免?
作为后续问题:C提供了一对函数setjmp和longjmp,它们不仅可以在当前堆栈帧内,而且可以在任何调用帧中进行转换.这些应该被视为像goto一样危险吗?更危险吗?
Dijkstra本人对这个头衔表示遗憾,他对此不负责任.在EWD1308(也是这里 .pdf)结束时,他写道:
最后是一个短篇小说的记录.1968年,ACM的通讯以" 被认为有害的goto声明 "的标题发表了我的一篇文章,遗憾的是,在后来的几年中,这一期刊最常被引用,但是,经常被作者看到的不多于标题,通过成为一个模板成为我的名声的基石:我们会看到几乎任何X的标题"X被认为有害"的各种文章,包括一个标题为"Dijkstra被认为有害"的文章.但是发生了什么?我提交了一份题为" 反对goto声明的案件 "的论文"为了加快出版速度,编辑已经变成了一封"给编辑的信",并在此过程中给了他一个新的自己的发明名称!编辑是Niklaus Wirth.
关于这个主题的经过深思熟虑的经典论文,与Dijkstra的相关,是结构化编程,由Donald E. Knuth撰写.阅读都有助于重新建立背景和对主题的非教条性理解.在本文中,Dijkstra对此案的观点得到了报道,甚至更为强烈:
Donald E. Knuth:我相信通过提出这样一种观点,我实际上并不同意Dijkstra的观点,因为他最近写了以下内容:"请不要陷入相信我非常悲惨的陷阱.去发言.我有其他人正在一个宗教出来的不舒服的感觉,就好像编程的概念问题可以通过一个单一的技巧来解决,通过编码规则的简单形式! "
我正在将一些Java代码转换为C#并找到一些标记为"break"的语句(例如)
label1:
    while (somethingA) {
       ...
        while (somethingB) {
            if (condition) {
                break label1;
            }
        }
     }
在C#中是否有等价物(当前读数暗示不是),如果没有,除了(比如说)具有bool标志以指示是否在每个循环结束时断开(例如)
bool label1 = false;
while (somethingA)
{
   ...
    while (somethingB)
    {
        if (condition)
        {
            label1 = true;
            break;
        }
    }
    if (label1)
    {
        break;
    }
}
// breaks to here
我会感兴趣的是为什么C#没有这个,因为它似乎不是很邪恶.
我是C#的新手,因为我请求帮助我实现这个:
        *
        *
       ***
        *
       ***
      *****
        *
       ***
      *****
     ******* 
        *
       ***
      *****
     ******* 
    ********* 
我刚才有这个代码:
class Program
{
    static void Main(string[] args)
    {
        AnotherTriangle ob = new AnotherTriangle();
        ob.CreateTriangle();
        Console.ReadLine();
    }
}
class AnotherTriangle
{
    int n;
    string result = "*";
    public void CreateTriangle()
    {
    flag1:
        Console.Write("Please enter number of triangles of your tree: ");
        n = int.Parse(Console.ReadLine());
        Console.WriteLine();
        if (n <= 0)
        {
            Console.WriteLine("Wrong data type\n"); goto flag1;
        }
        string s = "*".PadLeft(n);
        for (int i = …以下2个C#片段之间的执行存在差异吗?
do
{
    Console.WriteLine(x.ToString());
    ++x;
} 
while (x < 7);
和
label:
{
    Console.WriteLine(x.ToString());
    ++x;
}
if (x < 7) goto label;
我想弄清楚为什么这么糟糕.谢谢.
编辑:如果我添加括号,片段非常相似.
EDIT2:在Visual Studio中,我点击了Go to Disassembly,我得到以下代码:
            do
            {
00000037  nop 
                Console.WriteLine(x.ToString());
00000038  lea         ecx,[ebp-40h] 
0000003b  call        63129C98 
00000040  mov         dword ptr [ebp-48h],eax 
00000043  mov         ecx,dword ptr [ebp-48h] 
00000046  call        63148168 
0000004b  nop 
                ++x;
0000004c  inc         dword ptr [ebp-40h] 
            } 
0000004f  nop 
            while (x < 7);
00000050  cmp         dword ptr [ebp-40h],7 
00000054  setl        al 
00000057  movzx       eax,al 
0000005a  mov …class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Welcome To The Random.");    
        System.Threading.Thread.Sleep(1000);
        choosing:
        Console.WriteLine("Roll Standard Dice (D), Flip a Coin (2), 8-Ball (8), or Random Number 1-10 (R)");
        ConsoleKeyInfo result = Console.ReadKey();    
        if ((result.KeyChar == 'D') || (result.KeyChar == 'd'))
        {
            Console.WriteLine("Standard Dice Has been chosen, do you want to continue? Y/N");    
            ConsoleKeyInfo RSD = Console.ReadKey();
            if ((RSD.KeyChar == 'Y') || (RSD.KeyChar == 'y'))
            {
                Console.Write("Rolling");    
                Console.Write(".");    
                Console.Write(".");    
                Console.Write(".");    
            }
            else if ((RSD.KeyChar == 'N') || (RSD.KeyChar == 'n')) …我可以在默认情况下引用一个案例而不是复制粘贴整个代码吗?
例如:
switch(n)
{
    case(1): //code here...
        break;
    case(2): //code here...
        break;
    case(3): //code here...
        break;
    default: case(2);
        break;
}
我有一些方法可以从其他一些方法中调用.当在某些方法中执行某个操作时,我想回到第一个方法并跳过剩下的代码.目前,我booleans用来检查程序的"状态",但我想避免这种情况,因为这些方法应该是void从本质上说它们不需要返回任何东西.我发现了类似的东西,goto但只能在同一种方法中使用.
问题:有没有办法在C#中以不同的方法跳转到代码中的特定点?我在其他语言上发现了一些东西,但在C#上却没有.
现在的情况:
    void test1()
    {
        bool status = test2();
        if (!status)
            return; // the other stuff will not get done
        Debug.WriteLine("Initialization OK");
    }
    bool test2()
    {
        bool status = test3();
        if (!status)
            return false; // the other stuff will not get done
        // do other stuff 
        return true;
    }
    bool test3()
    {
        if (xxx)
            return false; // the other stuff will not get done
        else
            // do other stuff 
            return true;
    } …