我很好奇是否有办法让C#中的虚方法中的this为null。我认为这是不可能的。我在现有代码中看到了这一点,在代码审查期间,我想100%肯定会对其删除发表评论,但我希望得到社区的一些确认和更多背景信息。this!=null在任何非静态/实例方法中都是这样吗?否则它会是一个空指针异常吗?我在考虑扩展方法以及我可能不熟悉的来自多年Java的任何C#功能。 最佳答案 这不是标准的C#,而是来自Lasse的答案和Jon,通过一些IL-fiddling,您可以进行非虚拟调用(对虚拟或非虚拟方法)传递空this:usingSystem;using
是否有一个属性可以用来告诉编译器必须始终优化方法,即使未设置全局/o+编译器开关?我问的原因是因为我在玩弄基于现有方法的IL代码动态创建方法的想法;当代码经过优化时,我想做的操作相当容易,但在未优化的代码中变得非常困难,因为编译器生成了额外的指令。编辑:关于困扰我的非优化的更多细节......让我们考虑以下阶乘函数的实现:staticlongFactorialRec(intn,longacc){if(n==0)returnacc;returnFactorialRec(n-1,acc*n);}(注意:我知道有更好的方法来计算阶乘,这只是一个例子)启用优化后生成的IL非常简单:IL_000
我执行了以下代码:usingSystem;usingSystem.Collections.Generic;namespaceTestReleaseAndDebug{publicclassGClass{publicT1Name{get;set;}publicT2Age{get;set;}publicvoidDisplay(){Console.WriteLine("Name:"+Name);Console.WriteLine("Age:"+Age);}}classProgram{staticvoidMain(string[]args){GClassperson=newGClass();pe
我使用的是针对.Net4.6.2的标准VS2015编译器。编译器在finallyblock失败后发出无限循环。一些例子:调试:IL_0000:nop.try{IL_0001:nopIL_0002:nopIL_0003:leave.sIL_000c}//end.tryfinally{IL_0005:nopIL_0006:br.sIL_000a//loopstart(head:IL_000a)IL_0008:nopIL_0009:nopIL_000a:br.sIL_0008//endloop}//endhandler//loopstart(head:IL_000c)IL_000c:br.s
(int)((float)10.9*10)的计算结果为108。为什么?IMO(int)-cast应该在乘法运算后求值。 最佳答案 有趣的是,这里的问题是表达式是在编译时计算的,显然使用预期的单精度数学。这在调试和发布版本中都会发生://thisreplacesthewholeoperationIL_0001:ldc.i4.s108IL_0003:stloc.0IL_0004:ldloc.0IL_0005:callvoid[mscorlib]System.Console::WriteLine(int32)虽然案例varf=((floa
我刚刚构建了动态方法-见下文(感谢其他SO用户)。看起来Func创建为动态方法,IL注入(inject)比lambda慢2倍。有人知道为什么吗?(编辑:这是在VS2010中作为版本x64构建的。请从控制台而不是从VisualStudioF5内部运行它。)classProgram{staticvoidMain(string[]args){varmul1=IL_EmbedConst(5);varres=mul1(4);Console.WriteLine(res);varmul2=EmbedConstFunc(5);res=mul2(4);Console.WriteLine(res);dou
这里是一些用C#编写的测试程序:usingSystem;structFoo{intx;publicFoo(intx){this.x=x;}publicoverridestringToString(){returnx.ToString();}}classProgram{staticvoidPrintFoo(refFoofoo){Console.WriteLine(foo);}staticvoidMain(string[]args){Foofoo1=newFoo(10);Foofoo2=newFoo(20);Console.WriteLine(foo1);PrintFoo(reffoo2)
使用这个简单的C#代码,我运行cschello.cs;ildasm/out=hello.txthello.exe.classHello{publicstaticvoidMain(){System.Console.WriteLine("hi");}}这是ildasm的IL代码。.classprivateautoansibeforefieldinitHelloextends[mscorlib]System.Object{.methodpublichidebysigstaticvoidMain()cilmanaged{.entrypoint//Codesize13(0xd).maxstack
如何获取C#代码的IL代码?我可以使用外部库或存在内部函数来做到这一点吗?编辑:我想在我的应用程序中使用MessageBox显示IL代码。 最佳答案 以编程方式?你可以使用反射得到一个MethodInfo,然后调用MethodBase.GetMethodBody得到body。从MethodBody,您可以调用GetILAsByteArray除其他事项外。当然,如果你只是想自己检查一下,这里有Reflector,dotPeek、ildasm(.NETSDK的一部分),毫无疑问还有其他工具……
我正在查看为一个非常简单的方法生成的IL,因为我想自己做一些反射,我遇到了这个问题的评论中提到的一些东西(但不是问题):UsingBr_SOpCodetopointtonextinstructionusingReflection.Emit.Label没有人回答,我对此感到疑惑。所以...如果我有这样的方法:publicstringTest(){return"hello";}然后我在上面运行ILDASM我看到IL是这样的:.methodpublichidebysiginstancestringTest()cilmanaged{//Codesize11(0xb).maxstack1.loc