在类上有很多方法是否会增加该类对象的开销?

2022-09-03 15:03:27

想象一下,我正在使用一个类从数据库中带回项目,比如说

class BankRecord {

public int id;
public int balance;

public void GetOverdraft() {
...
}
public void MakeBankrupt(){
...
}

}

现在,如果只有2种方法(如上所述)或100种方法,也许其中一些方法非常大,那么使用它的性能会发生什么变化。

如果所有方法都在每个对象上,那么实例化数百个这样的对象会更糟吗?这是针对c#/java类型的语言,但最好知道所有语言。

或者,有一个单独的类,对这些对象执行所有操作,并将该对象保留为纯数据类,这是一种很好的做法吗?


答案 1

运行时在创建对象实例时不会复制代码。创建实例时,只会在内存中为成员字段分配空间。因此,您不应该创建“仅数据”类,除非您有其他设计原因这样做。

话虽如此,还有其他最佳实践原因可以解释为什么您可能不希望类具有多种方法(例如,God对象反模式)。


答案 2

不。在 CLR 中,对象具有指向该类型的元信息的指针,其中包括反射和方法表所需的所有内容。无论表中的条目数如何,在方法表中查找方法实现的开销都是相同的。有关详细信息,请参阅此文章。简而言之,所有对象都有 8 个字节的开销(4 个用于类型句柄,4 个用于同步块)。

但是,可能较慢的是反射。它只会使得如果你想枚举一个类型的元数据,那么如果有更多的成员在该类型中声明,它将会变慢。