jjzjj

c# - 为什么 C# 编译器显式声明一个类型实现的所有接口(interface)?

C#编译器似乎明确指出它的所有接口(interface)及其基类实现。CLI规范说这不是必需的。我已经看到其他一些编译器没有明确发出这个,而且它似乎工作正常。C#这样做有什么区别或原因吗?底层的C#为B生成的MSIL是:.classprivateautoansibeforefieldinitBextendsAimplementsIAdvanced,ISimple它不需要指定ISimple,因为A像IAdvanced一样实现它。C#代码:interfaceISimple{intBasic{get;}intZero{get;}}interfaceIAdvanced:ISimple{stri

c# - 无参数构造函数的第一个参数是什么?

我有这样一个简单的程序:publicclassFoo{publicFoo(){}publicintMyInt{get;set;}=10;publicListMyList{get;set;}=newList();}publicclassProgram{staticpublicvoidMain(){Console.WriteLine(newFoo().MyInt);Console.ReadLine();}}我决定查看此类程序的CIL代码(我对Foo的构造函数感兴趣)。这是它:.methodpublichidebysigspecialnamertspecialnameinstancevoid

c# - 是否有用于在运行时验证动态程序集的 MSIL 的 API?

当使用Reflection.Emit在运行时构建程序集时,我想在保存到光盘之前验证程序集MSIL。喜欢PEVerify但在运行时。有没有这样的API? 最佳答案 似乎peverify.exe是c:\Windows\Microsoft.NET\Framework\v4.0.30319\peverify.dll(或c:\Windows\Microsoft.NET\Framework\v2.0.50727\peverify.dllforCLR2.0),它是一个原生DLL(实际上,peverify.exe也是原生的)我在任何地方都没有看到这

c# - 奇怪的表现行为

所以我有这2个方法,假设将1000项长整数数组乘以2。第一种方法:[MethodImpl(MethodImplOptions.NoOptimization)]Power(int[]arr){for(inti=0;i第二种方法:[MethodImpl(MethodImplOptions.NoOptimization)]PowerNoLoop(int[]arr){inti=0;arr[i]=arr[i]+arr[i];i++;arr[i]=arr[i]+arr[i];i++;arr[i]=arr[i]+arr[i];i++;............1000Times........arr[

c# - finally block when 后编译器生成无限循环

我使用的是针对.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

c# - MS C# 编译器和非优化代码

注意:我注意到我发布的示例中存在一些错误-编辑以修复它如果您不启用优化,官方C#编译器会做一些有趣的事情。例如,一个简单的if语句:intx;//...//if(x==10)//dosomething优化后会变成下面这样:ldloc.0ldc.i4.s10ceqbne.un.sdo_not_do_something//dosomethingdo_not_do_something:但是如果我们禁用优化,它就会变成这样:ldloc.0ldc.i4.s10ceqldc.i4.0ceqstloc.1ldloc.1brtrue.sdo_not_do_something//dosomethingd

c# - 为什么这个非常简单的 C# 方法会产生如此不合逻辑的 CIL 代码?

我最近一直在深入研究IL,我注意到C#编译器有一些奇怪的行为。以下方法是一个非常简单且可验证的应用程序,它将立即退出,退出代码为1:staticintMain(string[]args){return1;}当我使用VisualStudioCommunity2015编译它时,生成了以下IL代码(添加了注释):.methodprivatehidebysigstaticint32Main(string[]args)cilmanaged{.entrypoint.maxstack1.localsinit([0]int32V_0)//LocalvariableinitIL_0000:nop//Do

c# - CIL 'fault' 子句与 C# 中的 'catch' 子句有何不同?

根据CLIstandard(第IIA部分,第19章)和System.Reflection.ExceptionHandlingClauseOptionsenum的MSDN引用页,有四种不同类型的异常处理程序block:catch子句:“捕获指定类型的所有对象。”filter子句:“仅当过滤成功时才输入处理程序。”finally子句:“处理所有异常并正常退出。”fault子句:“处理所有异常但不正常退出。”给出这些简短的解释(引用自CLI标准,顺便说一句。),这些应该映射到C#如下:catch—catch(FooException){…}filter—在C#中不可用(但在VB.NET中作为

c# - 在 C# 中使用枚举索引数组

我有很多固定大小的数字集合,其中每个条目都可以用常量访问。自然这似乎指向数组和枚举:enumStatType{Foo=0,Bar//...}float[]stats=newfloat[...];stats[StatType.Foo]=1.23f;这个问题当然是你不能使用枚举来索引一个数组而不进行强制转换(尽管编译后的IL使用的是纯整数)。所以你必须到处写:stats[(int)StatType.foo]=1.23f;我曾尝试寻找无需强制转换即可使用相同简单语法的方法,但尚未找到完美的解决方案。使用字典似乎是不可能的,因为我发现它比数组慢320倍左右。我还尝试为以枚举作为索引的数组编写一

c# - 寻找一种在运行时操作 .Net CIL 的方法

在Java中,我们使用javaagent参数和ASM(http://asm.ow2.org/)实用程序在运行/加载时通过类加载器修改内存中的字节码。(又名动态地向类中的方法添加方法调用)。这方面的一个例子是您删除对Log4j的所有调用以加速应用程序(http://surguy.net/articles/removing-log-messages.xml)。我正在尝试弄清楚如何使用C#/.Net在运行时执行相同的过程。我已经看到您可以为.Net操作CIL,但我还没有在运行时找到这样的示例。System.Reflection.Emit似乎是最接近的.Net等价物,您可以在其中动态创建类,但