C#是否支持存储引用(ref)的集合?
在C#中创建存储引用的列表
C#不支持直接声明List<ref int>这类存储引用的泛型列表,因为ref修饰的类型不能作为泛型类型参数。要实现你想要的「通过列表修改原始变量」的效果,可以用以下几种方案:
方案一:使用unsafe指针(需启用不安全代码)
通过指针直接存储变量的内存地址,修改指针指向的值即可改变原始变量:
unsafe { int a = 1, b = 2, c = 3; List<int*> intRefs = new() { &a, &b, &c }; *intRefs[1] = 42; Console.WriteLine(b); // 输出 42 }
注意:需要在项目设置中开启「允许不安全代码」选项,且指针存在内存失效风险(比如原始变量被回收后,指针会变成野指针)。
方案二:用委托封装读写操作
通过Func<int>和Action<int>委托包裹对原始变量的读写逻辑,无需unsafe代码,安全性更高:
int a = 1, b = 2, c = 3; List<(Func<int> Get, Action<int> Set)> varRefs = new() { (() => a, val => a = val), (() => b, val => b = val), (() => c, val => c = val) }; varRefs[1].Set(42); Console.WriteLine(b); // 输出 42
方案三:使用Span(适用于连续内存场景)
如果你的变量本身是数组元素或连续内存块中的值,Span<int>是更高效的选择,但它是固定长度的,无法像List那样动态添加元素:
int[] nums = { 1, 2, 3 }; Span<int> numSpan = nums.AsSpan(); numSpan[1] = 42; Console.WriteLine(nums[1]); // 输出 42
内容的提问来源于stack exchange,提问作者quetzalcoatulus
相关产品推荐
相关产品推荐

