C#中的通用接口是否可以阻止拳击? (.NET vs Mono性能)

我有一个C#接口,其中某些方法参数声明为object类型。 但是,传递的实际类型可能因实现接口的类而异:

 public interface IMyInterface { void MyMethod(object arg); } public class MyClass1 : IMyInterface { public void MyMethod(object arg) { MyObject obj = (MyObject) arg; // do something with obj... } } public class MyClass2 : IMyInterface { public void MyMethod(object arg) { byte[] obj = (byte[]) arg; // do something with obj... } } 

MyClass2的问题在于, byte[]object的转换是装箱和拆箱 ,这是影响性能的计算上昂贵的操作。

用通用接口解决这个问题会避免装箱/拆箱吗?

 public interface IMyInterface { void MyMethod(T arg); } public class MyClass1 : IMyInterface { public void MyMethod(MyObject arg) { // typecast no longer necessary //MyObject obj = (MyObject) arg; // do something with arg... } } public class MyClass2 : IMyInterface { public void MyMethod(byte[] arg) { // typecast no longer necessary //byte[] obj = (byte[]) arg; // do something with arg... } } 

这是如何在.NET vs Mono中实现的? 这两个平台都会有任何性能影响吗?

谢谢!

我不确定它是如何在单声道中实现的,但是通用接口将有所帮助,因为编译器为每个使用的不同类型创建特定类型的新函数(在内部,有一些情况下它可以使用相同的生成函数) 。 如果生成特定类型的函数,则无需对该类型进行装箱/取消装箱。

这就是Collections.Generic库在.NET 2.0中受到重创的原因,因为集合不再需要装箱并且效率明显提高。

您将在.NET中获得与Mono相同的好处。

我们强烈建议您一般使用Mono 1.9或Mono 2.0 RCx,因为generics支持仅适用于1.9。

MyClass2的问题在于,byte []与对象的转换是装箱和拆箱,这是影响性能的计算上昂贵的操作。

数组类型不涉及装箱,即使是具有值类型元素的装箱也是如此。 数组是引用类型。

(byte [])arg的开销最多是最小的。

是的,在.Net(MS不确定单声道)generics是在编译时实现的,因此根本没有装箱或拆箱。 与javagenerics对比,这是一种语法糖,它只是在后台为你执行演员表演(至少它是这样的一次)。 generics的主要问题是你不能多态地处理通用容器,但这有点偏离你的主题:-)

我无法与Mono交谈,但使用通用接口解决MS运行时中的装箱/拆箱问题。

鉴于您使用的是最新版本的mono,如果可以,请使用2.0。

Mono上的通用接口性能非常好,与常规接口调度配对。

调度通用虚拟方法[1]在所有已发布的单声道版本上都很糟糕,它在1.9中得到了改进。

问题并不是那么糟糕,因为通用虚拟方法的性能问题已经针对下一版本的mono(2.2)进行了修复,该版本计划在今年年底完成。

[1]通用虚拟方法类似于:

公共接口Foo {

  void Bla (T a, T b); 

}