通过阅读Juval Lowy的这篇启发性文章,试图了解Generics
释义..当您定义Generic类定义时,它将被编译为IL.
对于值类型,只要您请求特定的值类型,它就会用您的特定值类型替换T以获取该特定配置的IL,例如,MyList
好处:没有装箱和拆箱惩罚.
对于引用类型,编译器将所有优点...替换为定义中的所有T实例,并创建用于所有引用类型的IL.然而,实例是基于实际请求的ref类型分配的,例如MyList
现在预先泛型我们可以编写带Object
参数的方法.泛型声称100%的性能提升是因为它"避免了当您想要使用它时将对象类型向下转换为特定类型时所产生的性能损失"
// assume GetItem returns an Object string sMyPreciousString = (string) obList.GetItem();
当您从Object转发到特定引用类型时,这个性能会受到什么影响?此外,它似乎向对象(甚至泛型会做到这一点)的上传不是性能打击..为什么?
向上转换到对象不需要执行时间检查 - 它将始终有效,并且基本上只是一个无操作.
向下转换需要执行时间检查,以确保您没有将Stream转换为String.这是一个非常小的惩罚,并且不太可能成为瓶颈 - 但避免它只是泛型的一个额外好处.