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

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++的指针用法类似,但风险较高,需要自行控制变量生命周期避免野指针问题:

  1. 首先在项目属性中开启「允许不安全代码」配置
  2. 代码示例:
unsafe
{
    int test = 5;
    List<int*> testlist = new List<int*>();
    testlist.Add(&test);
    test = 7;
    Console.WriteLine(*testlist[0]); // 输出结果为7
}

注意:该方案仅推荐对性能要求极高且完全掌握C#内存管理逻辑的场景使用,普通业务开发不建议使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:06:04