当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#中的通用接口是否可以防止拳击?(.NETvsMono性能)》经验,为你挑选了3个好方法。

我有一个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中实现的?这两个平台都会有任何性能影响吗?

谢谢!



1> miguel.de.ic..:

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

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



2> leppie..:

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

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

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



3> Jordan Parme..:

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

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

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有