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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:06:20