我目前正在处理一个涉及System.Reflection.Emit的问题代码生成。我试图弄清楚在我将使用default(SomeType)的地方发出什么CIL在C#中。我在VisualStudio11Beta中运行了一些基本实验。JustDecompile向我显示default(bool)的以下CIL输出,default(string),和default(int?:.localsinit([0]boolV_0,[1]stringV_1,[2]valuetype[mscorlib]System.Nullable`1V_2)//boolb=default(bool);ldc.i4.0stl
以下C#函数:TResultOfFunc(Funcf){returnf();}毫不奇怪地编译为:IL_0000:ldarg.1IL_0001:callvirt0500000AIL_0006:ret但是等效的F#函数:letresultOfFuncfunc=func()编译成这样:IL_0000:nopIL_0001:ldarg.0IL_0002:ldnullIL_0003:tail.IL_0005:callvirt0400000AIL_000A:ret(两者都处于Release模式)。开头有一个额外的nop,我对此不太感兴趣,但有趣的是额外的ldnull和tail.指令。我的猜测(可能
我有这段代码发出一些IL指令,这些指令在null对象上调用string.IndexOf:MethodBuildermethodBuilder=typeBuilder.DefineMethod("Foo",MethodAttributes.Public,typeof(void),Array.Empty());varmethodInfo=typeof(string).GetMethod("IndexOf",new[]{typeof(char)});ILGeneratorilGenerator=methodBuilder.GetILGenerator();ilGenerator.Emit(O
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭12年前。你会认为两者是一样的。但也许是微软使用的编译器,但我注意到在编译两个非常小的程序时,逻辑相同。VB.NET使用更多的IL指令。如果仅仅因为它的编译器更智能,那么c#是否一定更快。
当使用DynamicMethod生成IL时,如果您为DynamicMethodconstructor中的restrictedSkipVisibility参数提供“true”,则可以调用方法和访问将无法访问的字段我宁愿将动态IL发送到动态程序集中,这样我就可以在构建时将生成的IL保存到程序集中。如果我使用此方法,则必须使用MethodBuilder而不是DynamicMethod。但是,我需要能够跳过可见性检查,以便在运行动态代码时不会出现MethodAccessException。有没有办法做到这一点,如果可以的话,怎么做? 最佳答案
以下代码导致slow1=1323ms、slow2=1311ms和fast=897ms。这怎么可能?此处:Nestedornotnestedif-blocks?他们提到Anymoderncompiler,andbythatImeananythingbuiltinthepast20years,willcompilethesetothesamecode.lets=System.Diagnostics.Stopwatch()letmutablea=1s.Start()foriin0..1000000000doifi 最佳答案 我已经从ild
所以I'vereadmanytimesbefore从技术上讲,.NET确实支持尾调用优化(TCO),因为它具有适用于它的操作码,而只是C#不生成它。我不确定为什么TCO需要操作码或它会做什么。据我所知,能够做到TCO的要求是递归调用的结果不与当前函数范围内的任何变量相结合。如果你没有那个,那么我看不出操作码如何阻止你必须保持堆栈框架打开。如果确实有,那么编译器就不能总是轻松地将它编译成迭代的东西吗?那么操作码有什么意义呢?显然我缺少一些东西。在TCO完全可能的情况下,难道不能总是在编译器级别而不是在操作码级别处理它吗?有什么地方不能的例子? 最佳答案
给定以下C#代码,其中Dispose方法以两种不同的方式调用:classDisposable:IDisposable{publicvoidDispose(){}}classProgram{staticvoidMain(string[]args){using(vardisposable1=newDisposable()){Console.WriteLine("using");}vardisposable2=newDisposable();try{Console.WriteLine("try");}finally{if(disposable2!=null)((IDisposable)dis
所以我用C#写了下面的代码。classTest{inta;System.IO.StreamReaderreader;publicTest(){a=5;reader=newSystem.IO.StreamReader(String.Empty);}}IL中类的构造函数如下所示.methodpublichidebysigspecialnamertspecialnameinstancevoid.ctor()cilmanaged{//Codesize33(0x21).maxstack8IL_0000:ldarg.0IL_0001:callinstancevoid[mscorlib]System
当您在C(或一般的.NET)中使用泛型集合时,编译器是否基本上完成了开发人员过去为特定类型生成泛型集合所必须做的腿部工作。所以基本上。…它只是帮我们节省了工作?现在我想,这不可能是正确的。因为没有泛型,所以我们不得不在内部使用非通用数组来进行集合,因此存在装箱和拆箱(如果是值类型的集合)等。那么,泛型在cil中是如何呈现的呢?当我们说我们想要一个通用的东西集合时,它在做什么呢?我不一定需要cil代码示例(尽管这没关系),我想知道编译器如何获取泛型集合并呈现它们的概念。谢谢!我知道我可以用ildasm来看待这个问题,但在我看来,我仍然是中国人,我还没有准备好解决这个问题。我只想知道c(以