草庐IT

c# - 为什么不可变对象(immutable对象)是线程安全的?

classUnit{privatereadonlystringname;privatereadonlydoublescale;publicUnit(stringname,doublescale){this.name=name;this.scale=scale,}publicstringName{get{returnname;}}publicstringScale{get{returnscale;}}privatestaticUnitgram=newUnit("Gram",1.0);publicUnitGram{get{returngram;}}}多个线程可以访问Unit.Gram。为什

c# - 在 64 位机器上基于 AnyCPU 与 x64 平台构建的 C# 应用程序的性能

我必须在64位机器上部署C#应用程序,尽管它也可以在32位机器上部署的可能性很小。我应该针对x86和x64平台构建两个单独的可执行文件,还是应该针对“AnyCPU”平台构建单个可执行文件(在项目属性的“构建选项”中指定)。针对“AnyCPU”构建的C#程序集之间是否存在任何性能差异部署在64位机器上与针对特定“x64”平台构建的相同程序集? 最佳答案 不,在64位Windows上运行的AnyCPU应用程序和在其上运行的x64应用程序在性能上没有差异。唯一改变标志的是编译程序集header中的一些标志,CLR仅使用它来决定是使用x86

c# - 在 64 位机器上基于 AnyCPU 与 x64 平台构建的 C# 应用程序的性能

我必须在64位机器上部署C#应用程序,尽管它也可以在32位机器上部署的可能性很小。我应该针对x86和x64平台构建两个单独的可执行文件,还是应该针对“AnyCPU”平台构建单个可执行文件(在项目属性的“构建选项”中指定)。针对“AnyCPU”构建的C#程序集之间是否存在任何性能差异部署在64位机器上与针对特定“x64”平台构建的相同程序集? 最佳答案 不,在64位Windows上运行的AnyCPU应用程序和在其上运行的x64应用程序在性能上没有差异。唯一改变标志的是编译程序集header中的一些标志,CLR仅使用它来决定是使用x86

c# - 具有泛型参数的接口(interface)与具有泛型方法的接口(interface)

假设我有这样的接口(interface)和具体实现publicinterfaceIMyInterface{TMy();}publicclassMyConcrete:IMyInterface{publicstringMy(){returnstring.Empty;}}所以我为strings创建了MyConcrete实现,我可以为int提供一个更具体的实现.没关系。但是假设我想做同样的事情,但是使用通用方法,所以我有publicinterfaceIMyInterface2{TMy();}publicclassMyConcrete2:IMyInterface2{publicstringMy(

c# - 具有泛型参数的接口(interface)与具有泛型方法的接口(interface)

假设我有这样的接口(interface)和具体实现publicinterfaceIMyInterface{TMy();}publicclassMyConcrete:IMyInterface{publicstringMy(){returnstring.Empty;}}所以我为strings创建了MyConcrete实现,我可以为int提供一个更具体的实现.没关系。但是假设我想做同样的事情,但是使用通用方法,所以我有publicinterfaceIMyInterface2{TMy();}publicclassMyConcrete2:IMyInterface2{publicstringMy(

c# - 为什么密封类型更快?

为什么密封类型更快?我想知道为什么这是真的更深层次的细节。 最佳答案 在最低级别,当您有密封类时,编译器可以进行微优化。如果您在密封类上调用方法,并且类型在编译时声明为该密封类,则编译器可以使用callIL指令而不是callvirt来实现方法调用(在大多数情况下)IL指令。这是因为方法目标不能被覆盖。Call消除了null检查并执行比callvirt更快的vtable查找,因为它不必检查虚拟表。这对性能来说可能是一个非常非常小的改进。话虽如此,在决定是否封课时我会完全忽略这一点。将类型标记为密封实际上应该是设计决策,而不是性能决策。

c# - 为什么密封类型更快?

为什么密封类型更快?我想知道为什么这是真的更深层次的细节。 最佳答案 在最低级别,当您有密封类时,编译器可以进行微优化。如果您在密封类上调用方法,并且类型在编译时声明为该密封类,则编译器可以使用callIL指令而不是callvirt来实现方法调用(在大多数情况下)IL指令。这是因为方法目标不能被覆盖。Call消除了null检查并执行比callvirt更快的vtable查找,因为它不必检查虚拟表。这对性能来说可能是一个非常非常小的改进。话虽如此,在决定是否封课时我会完全忽略这一点。将类型标记为密封实际上应该是设计决策,而不是性能决策。

c# - SecurityException:ECall 方法必须打包到系统模块中

我有一个类似于以下的(C#)函数。privatestaticboolSpecialCase=false;publicvoidFoo(){if(SpecialCase){InternalMethod();return;}Console.WriteLine();}[MethodImpl(MethodImplOptions.InternalCall)]privatestaticexternvoidInternalMethod();当我在调试器中使用.NETFramework4执行此操作时,该方法成功地将空行打印到控制台并返回。当我在调试器外部执行它时,它会抛出异常并显示以下消息:System

c# - SecurityException:ECall 方法必须打包到系统模块中

我有一个类似于以下的(C#)函数。privatestaticboolSpecialCase=false;publicvoidFoo(){if(SpecialCase){InternalMethod();return;}Console.WriteLine();}[MethodImpl(MethodImplOptions.InternalCall)]privatestaticexternvoidInternalMethod();当我在调试器中使用.NETFramework4执行此操作时,该方法成功地将空行打印到控制台并返回。当我在调试器外部执行它时,它会抛出异常并显示以下消息:System

c# - C# 不支持静态索引器吗?

这个问题在这里已经有了答案:StaticIndexers?(7个答案)关闭5年前。我已经尝试了几种不同的方法,但我得出的结论是它无法完成。这是我过去从其他语言中获得的一种语言特性。这只是我应该注销的东西吗?