You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

问询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:02:44