Tag: 编译器构造

在.NET中使用动态类型的性能成本

在.NET中使用dynamic vs object的性能成本是多少? 比方说,我有一个接受任何类型参数的方法。 例如 public void Foo(object obj) { } 要么 public void Foo(dynamic obj) { } ILSpy告诉我,在使用动态代码时,编译器必须插入代码块来处理动态。 因此,我想知道是否建议使用动态代替对象,以及这种用法以性能为代价的程度是多少?

C#编译器优化

我想知道是否有人可以向我解释一下编译器可能正在做些什么来观察一个简单方法的性能差异。 public static uint CalculateCheckSum(string str) { char[] charArray = str.ToCharArray(); uint checkSum = 0; foreach (char c in charArray) { checkSum += c; } return checkSum % 256; } 我正在与一位同事一起为消息处理应用程序做一些基准测试/优化。 在Visual Studio 2012中使用相同的输入字符串执行此function的1000万次迭代大约需要25秒,但是当使用“优化代码”选项构建项目时,在相同的1000万次迭代中,在7秒内执行相同的代码。 我非常有兴趣了解编译器在幕后做了什么,以便能够看到像这样看似无辜的代码块的性能提升超过3倍。 根据要求,这是一个完整的控制台应用程序,演示了我所看到的。 class Program { public static uint CalculateCheckSum(string str) { char[] charArray = str.ToCharArray(); uint checkSum = 0; foreach (char […]

C#中的开源C编译器?

我一直在进行编译器创建。 我发现了一些非常棒的初学者和先进的东西,但中间什么都没有。 我为玩具语言创建了3个不同的简单概念validation编译器,但我想让自己暴露在真实的东西之中。 语法方面最直接的真实语言似乎是C.因为我现在最熟悉的语言是C#,我喜欢研究用C#编写的真正的非教程C编译器的源代码。 是否存在(包含可用的源代码)? 理想情况下,我喜欢C编译器,而不是.NET或C#编译器,但使用C#编写的源代码。 我知道C# – > C感觉有点倒退,但是在我改变它之前,它允许我从熟悉的语言开始更深入地进入编译器。 虽然我不是在寻找C#/。NET编译器,但有些人会看到这个问题的人正在寻找: 为.NET Framework创建语言编译器 Mono C#编译器 用纯C#(.NET v1)编写的C#编译器的源代码 (感谢Luiscencio)

Visual Studio构建中“优化代码”选项的优点

我们的大部分C#发布代码都是在关闭“优化代码”选项的情况下构建的。 我相信这是为了让发布模式中内置的代码更容易调试。 鉴于我们正在创建相当简单的桌面软件,它连接到后端Web服务(即,不是特别是处理器密集型应用程序),那么如果可能出现任何类型的性能影响呢? 是否有任何特定平台可能受到更严重的影响? 例如。 多处理器/ 64位。

MSBuild如何决定是否需要重建C#库?

当MSBuild针对C#项目文件运行时,它是如何决定是否需要重建库(即调用csc)? 我想(但想确认): 如果没有输出目录,重建(duh :)) 如果C#文件已更改,请重建 如果标记为“复制”的包含文件始终更改,则重建 或者它是否足够聪明,不能重建,只是将文件复制到现有输出? 如果标记为copy-if-newer的包含文件已更改,则重建 与上述问题相同

是否有适用于Mac OS X的C#编译器?

我想在Mac OS上构建我的ASP.NET C#桌面应用程序,输出必须是在Mac OS上运行的应用程序。我怎么能这样做?有没有编译器?

条件表达式的类型无法确定?

我刚刚遇到这个(编写代码来演示“问题”): public ICollection CreateCollection(int x) { ICollection collection = x == 0 ? new List() : new LinkedList(); return collection; } 编译器抱怨: Fehler CS0173:Der Typ des bedingten Ausdrucks kann nicht bestimmt werden,weil keine implizite Konvertierung zwischen“System.Collections.Generic.List”und“System.Collections.Generic.LinkedList”erfolgt。 其翻译大致为: 无法确定条件运算符的类型,因为List和LinkedList之间没有隐式转换。 我可以看到为什么编译器会抱怨,但是,嘿,来吧。 它试图发挥愚蠢。 我可以看到两个表达式不是同一类型,但有一个共同的祖先,作为奖励,左侧的类型也是共同的祖先。 我相信编译器也可以看到它。 如果左侧被声明为var我可以理解错误。 我在这里想念的是什么? 编辑: 我接受詹姆斯·冈特的解释。 也许只是为了说清楚。 我可以很好地阅读编译器规范。 我想了解原因。 为什么有人决定以这种方式编写规范。 这种设计背后一定有原因。 根据詹姆斯的说法,设计原则是“没有惊喜”。 此外,CodeInChaos还解释了如果编译器试图从常见的祖先中推断出类型,您可能遇到的惊喜。

仅在特定类型上允许自定义属性

有没有办法强制编译器限制自定义属性的使用仅用于特定属性类型,如int,short,string(所有基本类型)? 类似于AttributeUsageAttribute的ValidOn- AttributeTargets枚举。

是否在类型之间共享generics类的静态成员

我正在尝试创建一个generics类,它将根据类型具有一些静态函数。 每种类型都有静态成员吗​​? 或者只有在使用通用的地方? 我问的原因是我想要每种类型的锁对象,而不是它们之间共享的对象。 所以,如果我有 class MyClass where T:class { static object LockObj = new object(); static List ObjList = new List(); } 我理解ObjList肯定会为每个使用的generics类型创建一个不同的对象,但LockObj在每个generics实例化( MyClass和MyClass )之间是不同的还是相同的?

C# – .NET和CF.NET的代码编译器

我有一个需要使用.NET和Compact .NET Framework编译的项目。 有可能创建一个C#编译器,用两个框架编译我的项目吗? CF.NET Framework中没有一些function,所以我自己创建它(创建与.NET Framework中具有完全相同名称和选项的类。如果我使用类似[CF35]的属性来解析这些类,则可以解析项目和: 使用CF.NET编译项目时使用此类 使用.NET编译项目时忽略此类 ? 感谢所有建设性的答案。 [编辑] 我知道解决方案包括创建两个引用相同文件的项目。 问题是,你应该每次都手动编译。 此外,当你将一个文件添加到一个文件时,你需要打开第二个文件并引用它,它只是无聊而且根据我们很多人来处理同一个项目,我想自动完成这个部分。 似乎可能吗? [编辑2]除了……资源文件外,一切正常! 所以,要恢复,我有三个项目: 开发项目(CF.NET) 发布项目(CF.NET 3.5),包括所有文件通过“” 发布项目(NET 3.5),包括所有文件“” 如上所述,一切正常,但现在我的问题是使用资源文件。 申请使用它的方法是什么? 当我使用开发项目时,正确检索资源文​​件 当我使用另外两个项目时,ResourceManager会抛出MissingManifestResourceException 任何的想法?