C# 中继承的性能注意事项

本文关键字:性能 注意事项 继承 | 更新日期: 2023-09-27 17:55:17

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

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

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

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# 中的继承通常是否具有相关的性能损失。大多数时候我不在乎,但有时我想优化一段高频代码。

C# 中继承的性能注意事项

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

不:它不是复制/粘贴 - 您用A编写的代码仍作为A的一部分。不,您不会仅仅因为继承而获得 2 个对象。它结合了行为;B的实例也具有A实现 - 但不是通过复制粘贴:B也是A - 即Dog也是Mammal,等等。