在谈到铸造时,我的意思是隐式演员。假设B类继承自A.因为我们在C#中只有单继承,当引用B引用引用A时,我们不必做任何这个''指针调整等等。实际上,这样的强制转换不是操作,因为B 是 A,A的所有字段在A对象和B对象中都有相同的偏移量。
还有一个问题:是否正在引用B来引用B实现的某个接口涉及任何开销?就个人而言,我没有看到任何理由,因为接口不能有字段(因此,这个''指针不必像上面的情况那样进行调整)。然而,有时我可以听到这样的意见,因此这个问题。
答案 0 :(得分:2)
有两项费用:
对于后者,我说的是JIT优化。请考虑以下代码:
string x = "hello";
object o = x;
string y = o.ToString();
我怀疑JIT最终会得到一个真正的虚拟方法调用,带有vtable查找等。没有内联的可能性。
如果我们要调用x.ToString()
,我希望JIT注意到String
是最后一个类,因此String.ToString
的实现不可能是进一步覆盖 - 允许在没有vtable查找的情况下进行调用,也可能内联。
这是猜测,但这是值得思考的事情。将对象视为更一般的类型的成本比复制引用的成本更有可能。