数组对象值修改疑问:为何引用赋值后结果与预期不符?
你的推测完全正确:解析引用类型数组的赋值逻辑
你的核心判断没错,问题的本质就是**引用类型的“按值传递引用”**机制,下面给你拆解两段代码的执行逻辑:
原代码的执行流程
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; } }
- 数组
arr初始化后,arr[0]存储的是指向Name="First"实例的引用值(可以理解为记录对象内存地址的“纸条”)。 var first = arr[0];这一步是把arr[0]里的引用值完整复制给first变量——此时first和arr[0]是两个独立的“纸条”,但都指向同一个First实例。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
相关产品推荐
相关产品推荐

