C#:简单对象与复杂对象及内存使用

C#:简单对象与复杂对象及内存使用,c#,memory,object,C#,Memory,Object,在处理大型集合时,以下哪种方法更好 仅使用字段/属性初始化SimpleObject,并使用包含SimpleObject所需的所有方法实现的SimpleObject控制器初始化SimpleObject。在运行时,我构建一个SimpleObject集合,实例化一个SimpleObject控制器并调用它的方法,传递我想要使用的SimpleObject 或 类“ComplexObject”,该类在传统OO方法中聚合SimpleObject和SimpleObject控制器。在运行时,我有一个complex

在处理大型集合时,以下哪种方法更好

仅使用字段/属性初始化SimpleObject,并使用包含SimpleObject所需的所有方法实现的SimpleObject控制器初始化SimpleObject。在运行时,我构建一个SimpleObject集合,实例化一个SimpleObject控制器并调用它的方法,传递我想要使用的SimpleObject

类“ComplexObject”,该类在传统OO方法中聚合SimpleObject和SimpleObject控制器。在运行时,我有一个complexObject集合,对它们进行迭代,根据需要调用它们的方法


有人向我建议,就内存使用而言,第一种方法更可取,因为所有重量级代码只在一个对象中,而不是集合中的每个对象中。我的理解是,如果我们在一个集合中有1000个这样的对象,这并不意味着内存中有1000个相同的方法实现。将有1000个数据实例,但它们将共享一个代码实例(x86代码段和数据段?)。它似乎也与一般的OO原则和封装背道而驰。

我认为除了有两个类定义而不是一个类定义之外,不会有任何区别


您认为没有1000个方法实现实例是正确的。编译后,所有方法都成为“全局”方法,其中包含一个隐藏的ComplexObject参数,该参数映射到C#中的
this
关键字。

除了有两个类定义而不是一个类定义之外,我不认为会有任何区别


您认为没有1000个方法实现实例是正确的。编译后,所有方法都成为“全局”方法,其中包含一个隐藏的ComplexObject参数,该参数映射到C#中的
this
关键字。

您应该采用第二种方法。代码没有每个实例的成本:每个类都有一个代码副本,而不是每个实例。因此,第一种方法对记忆没有好处。您是对的,OO风格是将函数与数据放在一起,以便封装它们;如果您采用第一种方法,则有人可能会通过直接使用SimpleObject而不是通过控制器方法来错误操作SimpleObject。

您应该采用第二种方法。代码没有每个实例的成本:每个类都有一个代码副本,而不是每个实例。因此,第一种方法对记忆没有好处。您是对的,OO风格是将函数与数据放在一起,以便封装它们;如果您采用第一种方法,则有人可能会直接使用SimpleObject而不是通过控制器方法来错误操作SimpleObject