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

数组对象值修改疑问:为何引用赋值后结果与预期不符?

你的推测完全正确:解析引用类型数组的赋值逻辑

你的核心判断没错,问题的本质就是**引用类型的“按值传递引用”**机制,下面给你拆解两段代码的执行逻辑:

原代码的执行流程

var arr = new Class[]
{
    new Class{Name = "First"},
    new Class{Name = "Second"}
};

var first = arr[0];

arr[0] = new Class { Name = "Third"};

Console.WriteLine(first.Name); // 输出 First

class Class
{
    public string Name { get; set; }
}
  1. 数组arr初始化后,arr[0]存储的是指向Name="First"实例的引用值(可以理解为记录对象内存地址的“纸条”)。
  2. var first = arr[0];这一步是把arr[0]里的引用值完整复制给first变量——此时first和arr[0]是两个独立的“纸条”,但都指向同一个First实例。
  3. arr[0] = new Class { Name = "Third"};是把arr[0]里的“纸条”替换成了指向新Third实例的地址,但first手里的“纸条”还是原来的,所以访问first.Name时,找到的还是最初的First实例。

验证代码的逻辑

ref Class first = ref arr[0];

arr[0] = new Class { Name = "Third" };

Console.WriteLine(first.Name); // 输出 Third

这里用ref关键字后,first不再是复制引用值,而是直接引用arr[0]的存储位置——相当于first是arr[0]的“别名”。当你把arr[0]的引用替换成新实例的地址时,first指向的就是这个更新后的存储位置,自然能访问到Third实例的Name属性。

简单总结:

  • 普通赋值是复制引用,两个变量独立指向对象;
  • ref赋值是绑定存储位置,两个变量共享同一个引用的存储容器。

内容的提问来源于stack exchange,提问作者Kosmonik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:18:20