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

.NET中如何通过引用传值到集合及相关集合选型咨询

嘿,咱们来一步步解决你的问题哈!

关于集合中按引用传递值的问题

一、如何通过引用将值传递给集合?

首先得明确.NET里值类型和引用类型的本质区别:

  • 引用类型(比如自定义类,string除外)存放在堆上,集合里保存的是它们的引用地址,所以修改集合中对象的属性/字段,原始对象必然跟着变。
  • 值类型(比如int、struct、bool)默认是值传递,集合里保存的是它们的副本——也就是说你修改集合里的项,只是改了副本,原始值完全不受影响。

那如果要让值类型也能通过引用传递到集合里,最常用的方案是用包装类包裹值类型:

// 通用值包装类
public class RefWrapper<T>
{
    public T Value { get; set; }
    public RefWrapper(T initialValue) => Value = initialValue;
}

// 实际使用示例
var myNum = new RefWrapper<int>(5);
var myList = new List<RefWrapper<int>> { myNum };

// 修改集合里的项
myList[0].Value = 10;
// 原始值也会跟着变
Console.WriteLine(myNum.Value); // 输出10

这种方式简单直接,性能也比反射好太多,完全符合你“修改集合项,原始项同步改变”的需求。

你提到的用动态名称(str...前缀)访问的方案,本质是用反射去操作字段/属性,不仅代码繁琐,还会带来性能损耗,确实算不上优雅,不推荐用。

二、.NET中有没有原生支持多值按引用传递的集合?

很遗憾,.NET类库中没有原生的、专门支持多值按引用传递的集合。因为集合的设计是通用的,默认遵循值类型/引用类型的传递规则。

不过你可以基于现有集合自己封装一个,比如上面的RefWrapper<T>配合List<RefWrapper<T>>,就相当于实现了支持按引用传递值的集合。另外,如果你需要更底层的操作,可以考虑用Span<T>或者Memory<T>,但它们有使用场景限制(比如Span<T>不能在异步方法里使用,不能作为类字段),灵活性不如包装类方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:18:51