.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
相关产品推荐
相关产品推荐

