想象一下,我正在使用一个类从数据库中恢复项目,比如说
class BankRecord {
public int id;
public int balance;
public void GetOverdraft() {
...
}
public void MakeBankrupt(){
...
}
}
现在,如果只有2种方法(如上所述)或100种方法(可能其中一些方法非常大),使用它的性能会怎样。
如果所有方法都在每个对象上,那么实例化数百个这些对象会更糟吗?这适用于c#/ java类型的语言,但对所有语言都知道。
或者,有一个单独的类,对这些对象执行所有操作,并将对象保留为纯数据类是一种好习惯吗?
答案 0 :(得分:8)
创建对象实例时,运行时不会复制代码。创建实例时,只有成员字段在内存中分配空间。因此,除非您有其他设计理由,否则不应创建“仅限数据”类。
话虽如此,还有其他最佳实践的原因,为什么你可能不想要一个有多种方法的课程(例如God object anti-pattern)。
答案 1 :(得分:5)
没有。在CLR中,对象具有指向该类型的元信息的指针,该信息包括反射和方法表所需的所有内容。无论表中的条目数是多少,在方法表中查找方法实现的开销都是相同的。有关详细信息,请参阅this article。简而言之,所有对象都有8个字节的开销(4个用于类型句柄,4个用于同步块)。
然而,可能更慢的是反射。它只是因为如果你想通过类型的元数据进行枚举,那么如果在该类型中声明了更多的成员,它将会更慢。