代码之家  ›  专栏  ›  技术社区  ›  Mike Mazur

C#中的通用接口是否防止装箱?(.NET vs.Mono性能)

  •  4
  • Mike Mazur  · 技术社区  · 16 年前

    我有一个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[] 往返 对象 boxing and unboxing ,这是影响性能的计算开销较大的操作。

    用一个简单的方法解决这个问题好吗 generic interface 避免装箱/拆箱?

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

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

    非常感谢。

    6 回复  |  直到 16 年前
        1
  •  14
  •   miguel.de.icaza    16 年前

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

    我们强烈建议您一般使用Mono 1.9或Mono 2.0 RCx,因为泛型支持只在1.9中成熟。

        2
  •  11
  •   leppie    16 年前

    对象是装箱和拆箱,这 计算成本很高 影响性能的操作。

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

    (字节[])arg上的开销最多是最小的。

        3
  •  8
  •   Jordan Parmer    16 年前

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

    这就是为什么Collections.Generic库在.NET2.0上大受欢迎的原因,因为集合不再需要装箱,而且效率显著提高。

        4
  •  2
  •   Phil Bennett    16 年前

        5
  •  1
  •   Joel Coehoorn    16 年前

    我不能和Mono说话,但使用通用接口 应该 在MS运行时解决装箱/取消装箱问题。

        6
  •  0
  •   id id    16 年前

    如果您使用的是最新版本的mono,请选择2.0。

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

    问题并没有那么严重,因为通用虚拟方法的性能问题已经在mono(2.2)的下一个版本中得到了解决,该版本计划在今年年底发布。

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

    公共接口{

      void Bla<T> (T a, T b);