将if语句编译成IL时,语句是什么样的?
这是C#中一个非常简单的构造.sombody可以给我一个更抽象的定义,它究竟是什么?
我在互联网上搜索过,无法找到关于回调如何工作的正确解释?
能否请您解释一下回补是如何工作的?它如何与标记一起使用?
我知道它有两种主要类型的标记:
我找到了这段代码,他们在这段代码中输入一个输入文件并使用RISKI语言创建一个文件.
在他们的第一次滚动中他们有:
PROGRAM : N FUNCTION M MAIN_FUNCTION
Run Code Online (Sandbox Code Playgroud)
你可以看到N和M是标记(它们是空卷).
language-agnostic compiler-construction bison intermediate-language
是否可以在函数执行过程中设置指向当前堆栈的指针(稍后获取)然后释放当前线程(不解除调用堆栈)并将其返回给线程池?然后,让另一个线程在该线程停止的地方继续?我知道这意味着调用函数的人不会知道当前的线程上下文会发生变化,并且可能会涉及编写一些自定义的IL代码来做这样的事情,但有没有办法做到这一点?
你好我正在生成一个类使用Reflection.Emit,我想知道你如何使用brfalse命令conditionals.
具体来说,我不知道我如何的翻译IL来操作码的brfalse.s命令.
我的方法有以下形式:
object MyMethod()
{
if(isTransaction) //isTransaction is a bool property
return Method1();
else return Method2();
}
条件
IL_0000: ldarg.0 // this
IL_0001: call instance bool RediusTests.DaemonBase::get_IsTransaction()
IL_0006: brfalse.s IL_0020 //how is this translated within opcodes?
Run Code Online (Sandbox Code Playgroud)
第一分支:
IL_0008:ldarg_0
IL_....... ///INSTRUCTIONS
IL_......
IL_001f:ret
Run Code Online (Sandbox Code Playgroud)
第二分支:
IL_0020:ldarg_0 //How do i specify with OPCODES to jump here?????
IL_.......
IL_......
IL_001f:ret
Run Code Online (Sandbox Code Playgroud)
对于第一个片段,什么是参数brfalse.s?
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Call, getIsTransaction);
ilgen.Emit(OpCodes.Brfalse,); //what do …Run Code Online (Sandbox Code Playgroud) 考虑以下:
interface ISomething
{
void Call(string arg);
}
sealed class A : ISomething
{
public void Call(string arg) => Console.WriteLine($"A, {arg}");
}
sealed class Caller<T> where T : ISomething
{
private readonly T _something;
public Caller(T something) => _something = something;
public void Call() => _something.Call("test");
}
new Caller<A>(new A()).Call();
Run Code Online (Sandbox Code Playgroud)
对 Caller<A>.Call 的调用以及对 A.Call 的嵌套 tcall 都是通过 callvirt 指令进行的。
但为什么?这两种类型都是众所周知的。除非我误解了什么,否则这里不应该使用 call 而不是 callvirt 吗?
如果是这样 - 为什么不这样做?这仅仅是编译器未完成的优化,还是背后有任何特定原因?