如何实现引用值数组?使数组元素修改同步更新原变量
实现值的同步修改方案
原代码里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
相关产品推荐
相关产品推荐

