问询C#中ref引用及普通引用传参的底层解引用工作原理
C#中ref引用与普通引用类型参数的底层解引用逻辑
先明确前提:Person是引用类型,声明Person变量时,变量本身存储的是堆上对象实例的内存地址,而非对象本身。
代码示例1的底层逻辑
static void SendAPersonByReference(ref Person p) { // Change some data of "p". p.personAge = 555; ... }
这里的参数ref Person p是引用的引用——参数p存储的是外部Person变量的内存地址(而非堆对象的地址)。当执行p.personAge = 555时,确实会发生两次自动解引用:
- 第一次解引用:从参数p中读取到外部
Person变量的地址,拿到这个变量里存储的堆对象地址。 - 第二次解引用:用堆对象地址找到堆上的
Person实例,修改它的personAge字段。
整个过程由编译器自动完成,不需要手动干预。
代码示例2的底层逻辑
static void SendAPersonByReference(Person p) { // Change some data of "p". p.personAge = 555; ... }
这里的参数Person p是值传递的引用——外部Person变量存储的堆对象地址会被复制一份,传给方法参数p。当执行p.personAge = 555时,只会发生一次解引用:直接用参数p里的堆对象地址,找到堆上的Person实例并修改字段。
虽然参数p是原引用的副本,但因为指向同一个堆对象,所以修改字段会影响原变量指向的对象。
内容的提问来源于stack exchange,提问作者Aka
相关产品推荐
相关产品推荐

