Tag: goto

C#.NET中的GOTO语句

try {… block: …. } catch{ ..} GOTO block … …. finally{…} 请问goto在这种情况下执行?

转到声明有害吗?

如果上面的陈述是正确的,那么为什么当我在.Net BCL上使用reflection器时,我看到它被大量使用了? 编辑:让我重新说一下:我在人类或编译器编写的reflection器中看到的所有GO-TO是什么?

我应该使用goto声明吗?

我有一段代码如下: try { Work: while(true) { // Do some work repeatedly… } } catch(Exception) { // Exception caught and now I can not continue // to do my work properly // I have to reset the status before to continue to do my work ResetStatus(); // Now I can return to do my work goto […]

在C#中处理“循环初始化”的其他方法

首先,我会说我同意goto语句在很大程度上与现代编程语言中的更高级别结构无关,并且在适当的替代品可用时不应使用。 我最近重新阅读了Steve McConnell的Code Complete原版,并忘记了他对常见编码问题的建议。 几年前,当我第一次开始时,我已经读过它,并且不认为我意识到配方会有多大用处。 编码问题如下:执行循环时,您经常需要执行循环的一部分来初始化状态,然后使用其他逻辑执行循环,并使用相同的初始化逻辑结束每个循环。 一个具体的例子是实现String.Join(delimiter,array)方法。 我想每个人第一个接受这个问题的都是这个。 假设append方法被定义为将参数添加到返回值。 bool isFirst = true; foreach (var element in array) { if (!isFirst) { append(delimiter); } else { isFirst = false; } append(element); } 注意:稍微优化一下就是删除else并将其放在循环的末尾。 赋值通常是单个指令并等效于else,并将基本块的数量减少1并增加主要部分的基本块大小。 结果是在每个循环中执行一个条件以确定是否应该添加分隔符。 我也看到并使用了其他处理这个常见循环问题的方法。 您可以先在循环外执行初始元素代码,然后从第二个元素到结尾执行循环。 您还可以将逻辑更改为始终将元素附加到分隔符,并且一旦完成循环,您只需删除添加的最后一个分隔符。 后一种解决方案往往是我更喜欢的解决方案,因为它不会复制任何代码。 如果初始化序列的逻辑发生变化,您不必记得在两个地方修复它。 然而,它需要额外的“工作”来做某事然后撤消它,至少导致额外的cpu周期,并且在许多情况下,例如我们的String.Join示例也需要额外的内存。 我兴奋地阅读这个结构 var enumerator = array.GetEnumerator(); if (enumerator.MoveNext()) { goto start; do { append(delimiter); start: […]

为什么这“最终”执行?

如果你运行下面的代码,它实际上在每次调用goto后执行finally: int i = 0; Found: i++; try { throw new Exception(); } catch (Exception) { goto Found; } finally { Console.Write(“{0}\t”, i); } 为什么?