C#中继承的性能考虑

时间:2011-05-06 05:51:49

标签: c# performance inheritance

如果我创建一个具有public int I;(或任何其他字段)的类,而不是创建一个继承自具有public int I;的基类的类,那么编译器是否生成相同的IL?

无论哪种方式,结果类的行为都相同,但编译器的行为是否相同?

即,编译器只是将代码从基类复制粘贴到派生类中,还是在继承时实际创建了两个不同的类对象?

class A
{
    public int I;
}

class B : A
{
}

以下两个DoSomething()调用之间是否有任何性能差异?

var a = new A();
var b = new B();
DoSomething(a.I);
DoSomething(b.I); // Is this line slower than the above line due to inheritance?

尝试忽略编译器可能针对此特殊情况执行的任何优化。我的问题是关于C#中的继承是否具有相关的性能损失。大多数时候我不在乎,但有时我想优化一段高频代码。

1 个答案:

答案 0 :(得分:9)

编译器发出的是相同的;实际上,即使在密封类上调用非虚拟实例方法时,它也使用Callvirt - 这与使用多态来调用任何方法的方法相同。

否:它不是复制/粘贴 - 您在A中编写的代码仍然是A的一部分。不,你只是因为继承而得不到2个对象。它结合了行为; B 的实例也具有来自A的实现 - 但不是通过复制粘贴:B 也是 A - 即Dog也是Mammal等。