只是想得到我的头周围泛的阅读 这个富有启发性的文章通过Juval洛伊

解释..当你定义的一般类定义,这是编入IL。

  • 值的类型,只要你请求对特定价值的类型,它代T与你的特定价值的类型以获得IL为,例如具体配置 MyList<int> 受益:没有拳击和拆箱的处罚。
  • 所有好的..供参考的类型、编译器取代了所有的实例T在您的定义与目的和创建IL这是用于所有ref类型。实例,但是分配的基础上的实际要求ref型例如 MyList<String>

现在预泛我们可以写方法 Object 参数。仿制药的权利要求100%的性能的改进,因为'它避免了性能处罚你会招致当你沮丧的对象类型对你的特定类型的时候你要用它

 // assume GetItem returns an Object
 string sMyPreciousString = (string) obList.GetItem(); 

这是什么能命中当你沮丧从目特定基准的类型?此外,它似乎是最铸造的对象(甚至泛型会这样做)不是一个能打..为什么?

有帮助吗?

解决方案

向上转换为对象并不需要一个执行办理登机手续时,它总是将工作,而仅仅是一个没有作基本上是这样。

向下转换需要一个执行时间检查,以确保你不浇铸的一流串的例子。这是一个非常小的惩罚,并且非常不可能是一个瓶颈,但避免这仅仅是一个额外的好处仿制药。

其他提示

该性能来自于需要一个运行的时间类型的检查。如果B是一个子类,然后当你投B入一个一个你知道在编制时间,这将是安全的,因为所有Bs为。因此,不需要产生任何运行时间代码的检查类型。

然而,当你投一个成B,你不知道在编制时是否一个实际上是B,或者没有。它可能只是一个,它可能是C型、不同类型的A.因此,需要运行时产生的代码,这将确定对象实际上是一个B而引发的例外,如果它不是。

仿制药没有这个问题,因为编译器知道,在编制时间,只有Bs投入数据结构,所以当你拉出来的东西,编译器都知道,这将是一个B,所以没有必要类型的检查在运行时间。

阅读的IL获取的产生(这个 文章 提到了它的)...啊哈-isinst.

如果你不是向下转换,你不要叫 isinst.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top