C# 如何实现修改原变量时同步变更List中存储的对应元素
你遇到的问题本质是C#中值类型和引用类型的存储差异:int属于值类型,将值类型变量添加到List时会执行值拷贝,List内存储的是和原变量完全独立的副本,因此修改原变量不会同步到List中的元素。
下面是几种可行的替代方案:
方案1:自定义泛型引用包装类(最推荐)
自己实现一个泛型引用类包装值类型,利用引用类型的特性实现同步修改,语义清晰无额外风险,适配所有C#版本:
// 定义通用值类型包装类 public class Ref<T> { public T Value { get; set; } public Ref(T value) { Value = value; } } // 业务代码示例 Ref<int> test = new Ref<int>(5); List<Ref<int>> testlist = new List<Ref<int>>(); testlist.Add(test); test.Value = 7; Console.WriteLine(testlist[0].Value); // 输出结果为7
修改List内元素也会同步到原变量:
testlist[0].Value = 10; Console.WriteLine(test.Value); // 输出结果为10
方案2:单元素数组快速实现
如果不想额外定义类,可以用长度为1的数组包装值类型,数组本身是引用类型,也能实现同步效果,缺点是语义不明确,可读性较差:
int[] test = new int[1] { 5 }; List<int[]> testlist = new List<int[]>(); testlist.Add(test); test[0] = 7; Console.WriteLine(testlist[0][0]); // 输出结果为7
方案3:不安全指针实现
C#实际上支持指针类型,只需开启不安全代码权限即可,和C++的指针用法类似,但风险较高,需要自行控制变量生命周期避免野指针问题:
- 首先在项目属性中开启「允许不安全代码」配置
- 代码示例:
unsafe { int test = 5; List<int*> testlist = new List<int*>(); testlist.Add(&test); test = 7; Console.WriteLine(*testlist[0]); // 输出结果为7 }
注意:该方案仅推荐对性能要求极高且完全掌握C#内存管理逻辑的场景使用,普通业务开发不建议使用。
内容的提问来源于stack exchange,提问作者MarioPL98
相关产品推荐
相关产品推荐

