草庐IT

JIT即时编译器

全部标签

c# - 编译器是否优化对 const 变量和文字 const 数字的操作?

假设我有一个带字段的类:constdoublemagicalConstant=43;这是代码中的某处:doublerandom=GetRandom();doubleunicornAge=random*magicalConstant*2.0;编译器是否会优化我的代码,使其不会在每次计算unicornAge时都计算magicalConstant*2.0?我知道我可以定义下一个将这个乘法考虑在内的常量。但这在我的代码中看起来更清晰。编译器对其进行优化是有意义的。 最佳答案 (这个问题是thesubjectofmybloginOctober

c# - 为什么 C# 编译器会产生方法调用以在 IL 中调用 BaseClass 方法

假设我们在C#中有以下示例代码:classBaseClass{publicvirtualvoidHelloWorld(){Console.WriteLine("HelloTarik");}}classDerivedClass:BaseClass{publicoverridevoidHelloWorld(){base.HelloWorld();}}classProgram{staticvoidMain(string[]args){DerivedClassderived=newDerivedClass();derived.HelloWorld();}}当我输入以下代码时:.methodpr

c# - 编译器说我没有实现我的接口(interface),但我实现了?

好的,我有两个命名空间。一个包含我的接口(interface),一个包含实现类。像这样:namespaceProject.DataAccess.Interfaces{publicinterfaceIAccount{stringSomeMethod();}}namespaceProject.DataAccess.Concrete{classAccount:Project.DataAccess.Interfaces.IAccount{stringSomeMethod(){return"Test";}}}使用这段代码我得到一个错误:'Project.DataAccess.Concrete.A

c# - c# 编译器是否优化 Count 属性?

Listlist=...for(inti=0;i那么编译器是否知道list.Count不必每次迭代都调用? 最佳答案 你确定吗?Listlist=newList{0};for(inti=0;i如果编译器缓存了上面的Count属性,list的内容将是0和1。如果没有缓存,内容将是从0到100.现在,这对您来说可能看起来像是一个人为的例子;但是这个呢?Listlist=newList();inti=0;while(list.Count这两个代码片段似乎完全不同,但这只是因为我们倾向于思考for循环与while循环。在任何一种情况下,每次

c# - 在 VS Code 中禁用特定的编译器警告

我想知道如何在VSCode中为整个项目抑制特定的编译器警告。我看过这个问题:Isitpossibletodisablespecificcompilerwarnings?但它适用于VisualStudio,而不适用于VisualStudioCode。以下是上面链接的问题中推荐的答案:1.SolutionExplorer>View>Properties>Build>SuppressWarnings和2.#pragmawarningdisablewarning-list对于#1:我在VSCode中的任何地方都找不到解决方案资源管理器。对于#2这只有在我将它包含在每个脚本的顶部时才有效。我需要

c# - Visual Studio 2017 编译器错误

我刚刚升级到VS2017,但马上就无法再构建我的项目,因为我遇到了一堆奇怪的编译器错误,这些错误在我使用VS15时并不存在。错误如:语法错误;预期值无效的表达式术语“[”无效的表达式术语“byte”使用泛型类型需要1个类型参数编辑1:刚刚创建了一个小型控制台应用程序并将一些代码复制到其中,但出现了相同的编译器错误usingSystem;usingSystem.Runtime.InteropServices;namespaceError{classProgram{staticvoidMain(){Arrayarray2D=null;if(array2DisBgra[,]){}}}publ

c# - 打印和/或修改 razor 编译器服务用于编译 cshtml 的 c# 版本

我希望能够找出razor使用哪个C#版本来编译我的cshtml模板。我想要这个的原因是thisbreakingchange.我们在foreach语句中有一个lambda,它在我们的本地开发机器上运行良好,但在我们的测试环境(没有安装C#5)上产生了一个错误。这个错误非常难以调试(我们甚至复制了所有测试环境DLL和数据库,但仍然无法重现该错误)。因此,为了防止将来出现这种开发/测试差异,我想知道是否有一种方法可以指定razor应该用来编译cshtml文件的C#版本。如果我可以检查razor使用的C#版本(通过打印),那就太好了。更新:根据要求,提供有关此行为如何发生的更多详细信息。我们使

c# - 语法错误与 Visual Studio 中的编译器错误,或红色波浪下划线与蓝色波浪下划线

VisualStudio看到的“语法错误”和“编译器错误”有什么区别?或者,换句话说,为什么有些“编译时”错误用红色波浪线加下划线,而有些用蓝色波浪线加下划线?这是一个例子:上面红色下划线的错误是这样描述的:Nooverloadformethod'ValidateFilteredRecipient'takes6arguments蓝色下划线的错误描述如下:'ValidateBuild':cannotdeclareinstancemembersinastaticclass我不清楚这两个错误的区别特征是什么。我认为找到答案是小菜一碟:我只是用谷歌搜索它,第一个结果将是一个MSDN页面,充分阐

c# - JIT 编译器的 IL 优化

我正在开发一个发出IL代码的编译器。重要的是,生成的IL由Mono和Microsoft.NETJIT编译器JIT为尽可能最快的机器代码。我的问题是:优化以下模式是否有意义:'stloc.0;ldloc.0;ret'=>'ret''ldc.i4.0;conv.r8'=>'ldc.r8.0'等等,或者JIT是否足够聪明来处理这些?是否有包含Microsoft/MonoJIT编译器执行的优化列表的规范?是否有任何关于优化IL的实用建议/最佳实践的好读物,以便JIT编译器可以反过来生成最佳机器代码(性能方面)? 最佳答案 您描述的两种模式是

c# - .NET 反编译器区分 "using"和 "try...finally"

给定以下C#代码,其中Dispose方法以两种不同的方式调用:classDisposable:IDisposable{publicvoidDispose(){}}classProgram{staticvoidMain(string[]args){using(vardisposable1=newDisposable()){Console.WriteLine("using");}vardisposable2=newDisposable();try{Console.WriteLine("try");}finally{if(disposable2!=null)((IDisposable)dis