Tag: 编译器构造

为什么Nullable 无法编译但是int? 没有’使用系统;’

在.Net 2中,代码: namespace ns { class Class1 { Nullable a; } } 不编译并给出错误: 找不到类型或命名空间名称’Nullable’(您是否缺少using指令或程序集引用?) 它缺少using System; 但是这段代码: namespace ns { class Class1 { int? a; } } 编译。 有人能解释一下原因吗?

奇怪的反编译代码来自generics类中的事件订阅代码

这个简单的课程 public class Test { public static void A(Window wa, Window wb) { wa.Closed += (s, e) => wb.Close(); } } 获取编译为this(我使用Reflector进行反编译): public class Test { [CompilerGenerated] private sealed class c__DisplayClass1 { public Window wb; public void b__0(object s, EventArgs e) { this.wb.Close(); } } public static void A(Window wa, Window wb) { wa.Closed += […]

编译器琐事:这段代码的结果是什么

我今天正在审查一些代码并遇到了一些代码(由此代码段准确描绘)…… public abstract class FlargBase{ public FlargBase(){ this.DoSomething(); } public abstract void DoSomething(); } public class PurpleFlarg: FlargBase{ public PurpleFlarg() : base(){ } public override void DoSomething(){ // Do something here; } } 编译器不提供任何错误或警告,但CodeAnalysis警告调用链包含对虚方法的调用,并可能产生意外结果。 我很好奇,因为正如我所看到的,有两件事情可能发生。 创建基类的实例将调用没有定义实现的方法。 我希望编译器出错,或者由于缺少实现而导致运行时抛出exception。 我假设编译器提供了{}的实现 我错误输入了原始代码; 它确实在类中包含了abstract关键字。 创建派生类的实例将导致对尚未实际构造的类的方法进行调用。 我原以为这会抛出exception。 此代码已在生产环境中使用了几个月。 它显然工作正常,没有人注意到任何奇怪的行为。 我希望StackOverflow上的不可思议的人才可以让我对这段代码的行为和后果有所了解。

在C#2.0中使用关键字var bad?

我读了一篇关于在C#2中使用C#3function的文章,例如你可以输入var x = 2; 即使项目是2.0项目,Visual Studio 2008编译器也会选择它并生成与键入int x = 2相同的代码。 但是我不知道的是,在某些情况下你不应该这样做吗? 我一直认为var关键字直到C#3才到达。如果编译器生成相同的代码并且我可以输入完全相同的C#3代码和C#2代码,那真的有什么不同,因为CLI是相同的, 对? 从上面的链接引用 在幕后,编译器生成常规的.NET 2.0代码。 .NET 2.0代码和.NET 3代码之间有什么区别吗?

编译为C#3.0或ISO-1或ISO-2的区别?

在Visual Studio 2010中,在“高级构建设置”下,“语言版本”有以下选项: 默认 ISO-1 ISO-2 C#3.0 编译为C#3.0是否有任何优势,例如基准速度或稳定性?

.net max class size

ASP.NET 3.5中的类的大小是否存在限制(可能是编译器限制)? 我有一个单独的类文件将继续增长,并可能变得非常大(容易100k行代码,或10k成员)。 我只需要知道代码行,原始文件大小或单个类中的成员数量是否有限制。 请不要问我为什么要做一些听起来既愚蠢又疯狂的事情; 我很清楚这种方法的后果。

Nullable 是不可能的,为什么不呢?

对不起,如果它是一个愚蠢的问题,我试图更好地了解.Net中的Nullable类型。 从我注意到的Microsoft源代码(使用ReSharper),我知道Nullable是一个结构,T需要是一个结构 public struct Nullable where T : struct 现在,我试着做这样的事情 public struct CustomNullable where T : struct { } public class CustomNullableClass where T : struct { } 我编译时遇到错误: Nullable a = null; Nullable<Nullable> a1 = null; 对于上面提到的代码,我得到一个错误’只有非可空的值类型可能是System.Nullable的基础’,但是如何在Nullable类型中强制执行? 并为 CustomNullable a2 = null; CustomNullableClass a3 = null; 我得到一个错误’类型System.Nullable必须是不可为空的值类型才能将其用作参数T’。 我现在有点困惑,有人可以帮助我理解发生了什么或者我不明白的东西? 非常感谢提前。 编辑:如果结构是值类型而值类型不能为null,那么Nullable如何成为结构? 信用:消费者

C#动态编译字符串和.cs文件

我正在一个网站上工作,用户可以在浏览器文本区域中为问题实现C#代码解决方案并提交。 然后,服务器将编译该代码以及我在服务器上提供的预定义接口。 将其视为战略设计模式; 我提供了一个策略界面,用户可以实现它。 所以我需要在运行时一起编译一个字符串和一个预定义的* .cs文件。 这是我现在只编译字符串部分的代码: CodeDomProvider codeProvider = CodeDomProvider.CreateProvider(“CSharp”); CompilerParameters parameters = new CompilerParameters(); parameters.OutputAssembly = “CodeOutputTest.dll”; // need to name this dynamically. where to store it? parameters.GenerateExecutable = false; parameters.IncludeDebugInformation = false; CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, request.Code); 用户会提交以下内容: public class UserClass : IStrategy { public string ExecuteSolution(string input) { // user code […]

为什么string.Empty比“”更推荐?

为什么string.Empty比””更推荐? 是因为当编译器解析代码并且”来了,编译器将准备好读取字符串?但是在string.Empty中编译器甚至不准备读取字符串?

我想减少我的VS.NET项目的编译时间 – 你对如何做到这一点的想法是什么?

我的项目是在Visual Studio 08中用C#开发的。 它是一个独立的桌面应用程序,大约有6万行代码。 曾几何时我喜欢在这个软件上工作 – 现在,赞美时间已经增长到大约2分钟,它变得不那么令人愉快了… 我认为我缺乏C#经验可能是一个因素; 例如,我已经在一个名称空间下开发了所有内容 – 具有结构良好的代码库使编译器能够在进行更改时仅重新编译代码的必要部分吗? 或者我是否需要将部分分成单独的项目/ DLL以强制实现这一点? 升级到最新的四核处理器有多大区别? 另一个想法是,对于程序员来说,这可能是一个典型的事情 – 像这样的漫长的编译时间只是必须要管理的东西? 提前致谢。