object与instance的区别及C#类实例化内存分配相关问题
面向对象术语与C#内存分配问题解答
Q1:object与instance的术语差异
- 你示例中的a1、a2、a3二者均可指代,绝大多数开发场景下
object(对象)和instance(实例)可以完全混用,不会产生歧义。 - 仅在少数狭义语境下会有专属使用场景:
- 强类型语言的特定语境中,
object会特指顶层基类的实例,比如C#里的System.Object、Java里的java.lang.Object的实例,此时如果要明确指向类A的实例,会优先用instance of A的表述 - 偏理论的面向对象教材中,部分资料会把
object用来泛指所有可被操作的运行时内存实体(包括值类型的实例),instance则仅用来指代类类型模板实例化出的产物
- 强类型语言的特定语境中,
- 两个术语被区分使用的核心原因是起源场景不同:
instance更偏向和「类(class)」的对应关系,强调它是类模板派生的产物;object更偏向运行时视角,强调它是可被调用、传递的独立实体,不同语境长期演化后就形成了细微的使用差异,工业界日常开发不需要做严格区分。
Q2:C#引用类型的内存分配规则
- 首先明确:代码中的
A是类,属于引用类型,a1和a2本质上都是指向托管堆实例的引用指针,二者本身的内存存储结构没有任何差异,共同指向堆上的同一块实例内存。 - 针对你提出的子问题逐一解答:
- 执行
A a1 = new A(..1..)时,确实需要做两部分内存分配:除了托管堆上24字节的实例内存外,还要为a1单独分配引用内存,用来存储实例在托管堆上的内存地址。 - 引用内存的大小由进程运行位数决定:32位进程下引用大小固定为4字节,64位进程下引用大小固定为8字节,和所属类的内存占用大小无关。
- 执行
A a2 = a1时,不会再分配新的24字节实例内存,仅会为a2单独分配一块和a1大小相同的引用内存,再把a1存储的实例地址复制到a2的内存空间即可,因此a2仅占用引用本身的大小。
- 执行
内容的提问来源于stack exchange,提问作者supernatural
相关产品推荐
相关产品推荐

