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

如何实现引用值数组?使数组元素修改同步更新原变量

实现值的同步修改方案

原代码里int是值类型,数组中存储的是test的副本,所以修改数组元素只会改变副本的值,不会影响原变量test。要实现所有关联变量同步更新,你可以用包装类包裹值类型,让数组存储包装类的引用(引用类型),这样所有操作都会指向同一个实例,自然同步变化。

修改后的代码示例

// 定义包装类,封装int值
public class IntWrapper
{
    public int Value { get; set; }
}

// 主逻辑
var wrapper = new IntWrapper { Value = 5 };
IntWrapper[] array1 = { wrapper };
IntWrapper[] array2 = { wrapper };

array1[0].Value += 5; // 此时wrapper.Value变为10
array2[0].Value += 5; // 此时wrapper.Value变为15

Console.WriteLine(wrapper.Value); // 输出15
Console.WriteLine(array1[0].Value); // 输出15
Console.WriteLine(array2[0].Value); // 输出15

原理说明

  • IntWrapper是引用类型,数组array1和array2中存储的都是同一个wrapper实例的引用。
  • 修改array1[0].Value或array2[0].Value时,本质是修改同一个wrapper实例的Value属性,所有指向该实例的引用都会读取到最新值。
  • 原需求中的test可以直接用wrapper.Value替代,若要保留test变量,不要直接赋值int test = wrapper.Value(会产生副本),而是直接通过wrapper.Value访问。

另一种可选方案:使用ref关键字(C# 7.2+)

如果不想定义包装类,也可以用ref数组,但语法有一定限制:

int test = 5;
Span<int> array1 = stackalloc int[] { test };
ref int refTest = ref test;
array1[0] = ref refTest;

Span<int> array2 = stackalloc int[] { test };
array2[0] = ref refTest;

array1[0] += 5; // test变为10
array2[0] += 5; // test变为15

Console.WriteLine(test); // 输出15
Console.WriteLine(array1[0]); // 输出15
Console.WriteLine(array2[0]); // 输出15

这种方式依赖Span和栈分配数组,使用场景有限(比如部分托管环境不支持),包装类方案更通用易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:40:57