Tag: 编译器构造

C#编译器优化 – 未使用的方法

C#编译器(在VS2008或VS2010中)在编译时是否删除未使用的方法? 我认为决定是否使用公共方法可能有问题,所以我猜它会编译所有的公共方法。 但是在类中从未使用的私有方法呢? 编辑: 是否存在关于编译器optmization的一组规则,这些规则在任何地方都有记录?

为什么C#不允许我在不同的范围内使用相同的变量名?

比如: if ( this.IsValid ) { Matrix matrix = new Matrix(); } Matrix matrix = new Matrix(); 编译器警告我说: “名为’ matrix ‘的局部变量不能在此范围内声明,因为它会给’ matrix ‘赋予不同的含义,’ matrix ‘已在’子’范围内用于表示其他内容。 这些变量不是在不同的范围内,所以我无法从if语句外部访问第一个matrix吗?

单声道编译器即服务(MCS)

我想从我的常规.NET 3.5应用程序中使用Mono的编译器作为服务。 我已经下载了最新的位(2.6.7),在Visual Studio中创建了一个简单的控制台应用程序并引用了Mono.CSharp dll。 然后,在我的控制台应用程序中(直接在线样本): Evaluator.Run(“using System; using System.Linq;”); bool ress; object res; Evaluator.Evaluate( “from x in System.IO.Directory.GetFiles (\”C:\\\”) select x;”, out res, out ress); foreach (var v in (IEnumerable)res) { Console.Write(v); Console.Write(‘ ‘); } 这会在Evaluator.Run(第一行)引发exception: Illegal enum value: 2049. Parameter name: access 这是因为dll是使用Mono.exe编译的,而不是csc.exe,我相信。 我已经尝试直接从demo-repl.zip文件中的http://tirania.org/blog/archive/2010/Apr-27.html下载Mono.CSharp dll ……这不会引发exception。 ..但是在调用Evaluator.Evaluate之后out参数(res)是null …所以我不确定出了什么问题。 没有例外被抛出…… 所以,我想弄清楚为什么我从demo-repl.zip下载的dll返回null。 编辑:我弄清楚为什么它返回null。 看起来由于某种原因,编译器没有拿起System.Linq命名空间……虽然我不知道为什么……如果我只是评估“System.IO.Directory.GetFiles(\”C:\\ “)”,它运作正常。 […]

编译器值类型分辨率和硬编码“0”整数值

首先,有点背景。 阅读此处发布的问题和已接受的答案,以了解我的问题的具体方案。 我不确定是否存在其他相似的案例,但这是我所知道的唯一案例。 上面的“怪癖”是我早已意识到的。 直到最近,我才明白原因的全面性。 微软关于SqlParameter类的文档对这种情况有了更多的了解。 在value参数中指定Object时,将从Object的Microsoft .NET Framework类型推断出SqlDbType 。 使用SqlParameter构造函数的此重载指定整数参数值时请小心。 因为此重载采用Object类型的值 ,所以必须在值为零时将整数值转换为Object类型,如下面的C#示例所示。 Parameter = new SqlParameter(“@pname”, Convert.ToInt32(0)); 如果不执行此转换, 编译器会假定您尝试调用SqlParameter(string,SqlDbType)构造函数重载。 (emph。补充) 我的问题是为什么编译器假设当你指定硬编码“0”(并且只有值“0”)时,你试图指定枚举类型而不是整数类型? 在这种情况下,它假定您声明SqlDbType值,而不是值0。 这是非直观的,更糟糕​​的是,错误是不一致的。 我有我写过的旧应用程序多年来一直调用存储过程。 我将对应用程序进行更改(通常甚至与我的SQL Server类无关),发布更新,此问题将突然中断应用程序。 当包含多个方法签名的对象包含两个相似的签名,其中一个参数是对象/整数而另一个接受枚举时,为什么编译器会被值0混淆? 正如我所提到的,我从未将其视为任何其他类的任何其他构造函数或方法的问题。 这对于SqlParameter类是唯一的还是在C#/ .Net中inheritance的bug?

C#编译器是否足够智能以优化此代码?

请忽略此问题中的代码可读性。 在性能方面,如下所示代码应如下所示: int maxResults = criteria.MaxResults; if (maxResults > 0) { while (accounts.Count > maxResults) accounts.RemoveAt(maxResults); } 或者像这样: if (criteria.MaxResults > 0) { while (accounts.Count > criteria.MaxResults) accounts.RemoveAt(criteria.MaxResults); } ? 编辑: criteria是一个class , MaxResults是一个简单的整数属性(即public int MaxResults { get { return _maxResults; } } 。 C#编译器是否将MaxResults视为黑盒并每次评估它? 或者它是否足够聪明,可以发现我有3次调用同一个属性而没有在调用之间修改该属性? 如果MaxResults是一个领域怎么办? 优化法则之一是预先计算,所以我本能地像第一个列表那样编写这个代码,但我很好奇是否自动为我做了这种事情(再次,忽略代码可读性)。 (注意:我对听到“微优化”论证不感兴趣,这个论点可能在我发布的具体案例中有效。我只是想了解正在发生或未发生的事情的一些理论。)

当C#在同一个包含的类中时,为什么以及如何允许访问类本身之外的私有变量?

我不知道这个问题是否足够描述,但为什么以及这种行为是如何存在的? public class Layer { public string Name { get; set; } private IEnumerable children; public IEnumerable Children { get { return this.children.Where ( c => c.Name != null ).Select ( c => c ); } set { this.children = value; } } public Layer ( ) { this.children = new List ( ); // […]