c# - C#中继承的性能考虑

标签 c# performance inheritance

如果我使用 public int I;(或任何其他字段)创建一个类,与创建一个继承自具有 public int 的基类的类相比,编译器是否会生成相同的 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# 中的继承是否通常具有相关的性能损失。大多数时候我无所谓,但有时我想优化一段高频代码。

最佳答案

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

不:它不是复制/粘贴 - 您在 A 中编写的代码仍然是 A 的一部分。不,你不会因为继承而得到 2 个对象。它结合了行为B 的实例也有 A 的实现 - 但不是通过复制粘贴:a B 也是A - 即也是哺乳动物等。

关于c# - C#中继承的性能考虑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5907310/

相关文章:

c# - 返回 bool 值并重新抛出异常

javascript - 原型(prototype)继承以及如何执行 super()

c# - 当不允许属性 setter 时抛出什么异常?

java - 为什么父类和子类都实现相同的接口(interface)?

java - Android gridview 不维护元素顺序(除非牺牲性能)

c# - 无法迭代 iTextSharp 中的字段

c# - 如何解析 utc 日期

c# - 如何清除通过行为绑定(bind)到 ViewModel 的 WPF PasswordBox?

sql - 对多列进行 DISTINCT 计数

java - 将 Integer ArrayList 作为 Intent 额外发送的最佳方式?