每个人都知道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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在C#中是否有等价物(当前读数暗示不是),如果没有,除了(比如说)具有bool标志以指示是否在每个循环结束时断开(例如)
bool label1 = false;
while (somethingA)
{
...
while (somethingB)
{
if (condition)
{
label1 = true;
break;
}
}
if (label1)
{
break;
}
}
// breaks to here
Run Code Online (Sandbox Code Playgroud)
我会感兴趣的是为什么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 = …Run Code Online (Sandbox Code Playgroud) 以下2个C#片段之间的执行存在差异吗?
do
{
Console.WriteLine(x.ToString());
++x;
}
while (x < 7);
Run Code Online (Sandbox Code Playgroud)
和
label:
{
Console.WriteLine(x.ToString());
++x;
}
if (x < 7) goto label;
Run Code Online (Sandbox Code Playgroud)
我想弄清楚为什么这么糟糕.谢谢.
编辑:如果我添加括号,片段非常相似.
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 …Run Code Online (Sandbox Code Playgroud) 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')) …Run Code Online (Sandbox Code Playgroud) 我可以在默认情况下引用一个案例而不是复制粘贴整个代码吗?
例如:
switch(n)
{
case(1): //code here...
break;
case(2): //code here...
break;
case(3): //code here...
break;
default: case(2);
break;
}
Run Code Online (Sandbox Code Playgroud) 我有一些方法可以从其他一些方法中调用.当在某些方法中执行某个操作时,我想回到第一个方法并跳过剩下的代码.目前,我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;
} …Run Code Online (Sandbox Code Playgroud)