![]() |
1
12
首先,我认为你把跳远和跳远混为一谈,把跳远和跳远混为一谈。一个典型的C型跳远可以从两个方面来考虑:一,它就像抛出一个不清理堆栈帧的异常。第二,这就像从函数返回到“错误”地址。 在C#中,以上任何一项都不可能。C不支持跳远;我们已经尝试接球最后投掷,以一种干净、结构化和安全的方式进行非本地goto。 C也不支持从局部变量声明空间外部到空间内部的短跳转。原因是,从外面跳到一个街区的中间是令人困惑、危险、难以理解和难以维持的。这个设计目标的实现方式是 标签 也一样 范围 作为局部变量。“goto”甚至都看不到标签,比该位置的代码在不同的局部变量声明空间中声明的局部变量还要多。 有很多方法可以解决你的问题而不使用任何goto语句。例如,一想到
这非常简单,易于阅读,易于调试,等等。 或者:如果“doSecondThing”结果中的共享代码实际上很难重构成它自己的方法,那么考虑后退一步,并决定您的控制流是否太复杂而无法开始。例如,如果你在一个循环中对很多变量进行变异,那么也许有一些技术可以用来简化这种情况,减少变异。你能提供更多关于这段代码正在做什么以及为什么很难重构它的信息吗? |
![]() |
2
3
不要做下面描述的任何事情。这是一个坏主意,只是为了提供信息或作为智力练习。
C语言不支持跳出范围。所以,不可能按照你在C#里的要求去做。然而, 伊利诺伊州 将允许您这样做,因为IL低于C#,并且没有这种形式的范围。 所以,如果你真的想在忽略作用域的同时支持goto,你可以使用后期编译器工具来修改IL。类似于 Mike Stall's tool . 注: 这是一个可怕的,可怕的主意。 我甚至认为这是一种智力活动,我应该感到羞愧。 如果实际尝试为生产代码执行此操作,则此操作将中断的原因:
|
![]() |
3
3
这里有龙。 试图回答标题中的问题,我的第一次尝试自然是通过互操作和导入 设置JMP 和 龙吉普 从msvcrt.dll。
看来我已经使导入签名正确了,但最终,它不能这样工作。P/Invoke在对本机setjmp的调用周围创建一个包装器,因此
就这样。有 不可能 在山上。。。我的意思是,用纯C来调用这两个函数。我能想到的唯一方法是通过破解某些方法的JITted本机代码来“内联”调用,并手动包含对 设置JMP . 很抱歉,即使是我也没有理由在没有任何正当理由的情况下这样做。 但是如果我不能从C语言调用函数,我当然可以从C++ +CLI!
我可能在那个代码中犯了一些可怕的错误,但是C++不是我的母语,对不起。不过,它确实起到了作用。不知为什么,从
“再见世界!”从不显示,而是显示从0开始递增的数字。移植 Wikipedia example 同样有效:
输出:
一开始我还以为它会跳过
如果要跳转到任意方法到任意标签,请创建状态机。
嗯,C中有一些内部状态机支持迭代器和
Â
我从乔恩·斯凯特的作品中得到了一些灵感 article 关于在C#中实现COMEFROM。
总结这段代码,调用
我想也有可能将异步方法与C++ /CLI代码结合起来,以去除
请记住,在C#-异常处理中已经有了一个有用的“跳远”机制。 |
![]() |
4
1
为什么不:
工作? 编辑:已更新为使用缓存,以避免在您不希望的情况下出现导致副作用的情况。 |
![]() |
5
1
如果条件和生成的代码可以用rvalues表示,则可以使用短路操作来执行在不使用goto或标志的情况下不可能执行的操作。就你而言: if (condition1() ? (DoSomethingHere(),condition2()) : condition3()) DoSomethingHere2(); 可能不是我通常如何编写它,除非DoSomethingHere显然与条件2的求值相关联,但它应该产生所需的语义。我不确定我是否希望编译器能够识别?:根据条件(与将其作为零/非零结果进行求值和基于此进行条件跳转不同)。 顺便说一句,比起goto,我更讨厌标志的某些用法,因为每个标志都会给程序流添加另一个“维度”——如果一个正在绘制程序流图,那么程序中任何给定位置上可能相关的标志的每个不同组合都代表一个不同的节点。如果必要的执行模式可以通过“goto”和“no”标志来实现,那么这可能比使用标志和“goto”更好。 |
![]() |
6
0
根据您的代码,以下内容是等效的:
你能提供更多的上下文来说明为什么这不起作用吗? |
![]() |
7
0
这里有一种方法,我不确定它是否是最好的,不用去做你想做的事
|
![]() |
8
0
关于setjmp/longjmp的主题,您可以使用它的bigger brother:
continuations
. C语言不支持它们,但您可以使用
continuation passing style
,结合
lazy evaluation
或
trampolines
所以你得不到
|
![]() |
9
-1
是的,这是可能的。考虑一下:
但是,它很快就会使您的代码不可读:) 代码的输出为: 1个 2个 三 4个 5个 6个 7个 八 9个 下一个数字可以除以10 10 11。。。。。各就各位。 方法1的ILDASM输出:
方法2的ILDASM输出:
执行的示例输出:
|
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |