C#-对象转换
作者:互联网
据我所知,如果要处理COM接口,通常任何简单的转换都将触发QueryInterface例程,该例程用于确定对象是否实际实现了相应的COM接口.
object whatever;
IComInterface casted = (IComInterface) whatever;
因此,以下代码(取决于编译器和优化方式)可能会在内部对象强制转换实现中触发QueryInterface:
IComInterface comInteface;
// I guess nothing COM-related happens here, but I might be wrong
object whatever = comInteface;
// This might or might not trigger the 'QueryInterface' call.
IComInterface comInterface2 = (IComInteface) whatever;
问:
假设我有一个通用List< T>实例:
List<IComInterface> list = new List<IComInterface>();
现在,我是否可以保证以下代码不会触发基于QueryInterface的强制转换?
List<IComInterface> list = new List<IComInterface>();
IComInterface comInterface = (...); // Somehow got it.
list.Add(comInteface);
IComInterface retrieved = list[0];
>使用ArrayList代替List< T>这实际上导致执行强制转换,因为您必须从无类型对象实例中获取相应的IComInterface.
>但是,如果是泛型,我想所有事情都应该在不进行强制转换的情况下完成,但实际上我不确定它们在表面如何工作.
> List< T>仍然以某种方式对对象类型进行操作(因此,将在所述方案中调用基于QueryInterface的强制转换)?
>如果对上一个问题的答案为“否”,那是真的,您不能保证任何可能的IList< T>都相同吗?
解决方法:
是的,这是相当不错的保证,除非必须这样做,否则编译器不会发出Opcodes.Castclass IL指令.类型匹配,因此不需要强制转换.
一般来说,这不应该引起您的注意. COM接口的QI实现由于各种原因而被敲定,这是COM内部的.它总是非常快,仅需花费几纳秒的时间即可完成.
标签:casting,com,queryinterface,c 来源: https://codeday.me/bug/20191201/2078039.html