技术问询:集合中对象为副本而非引用,能否创建引用对象集合?
如何创建存储引用对象的集合
嘿,这个问题我之前踩过坑!确实,不少编程语言里,集合对值类型(比如基础数据类型、结构体这类)默认会存储副本,而不是原对象的引用——这就是你调试时看到x和xr是不同对象的原因。不过要实现存储引用对象的集合,完全可以做到,下面分几种常见场景给你方案:
1. 用包装类包裹值类型(通用方案)
如果你用的是面向对象语言(比如C#、Java),最稳妥的办法是给需要引用的值类型套一层包装类。因为类属于引用类型,集合里存储的会是包装类实例的引用,修改包装类内部的值时,集合里的对应项也会同步变化。
举个C#的例子:
// 通用的引用包装类 public class RefWrapper<T> { public T Value { get; set; } public RefWrapper(T initialValue) => Value = initialValue; } // 使用示例 var refCollection = new List<RefWrapper<int>>(); int x = 5; var xWrapper = new RefWrapper<int>(x); refCollection.Add(xWrapper); // 修改原包装类的值,集合里的项也会跟着变 xWrapper.Value = 10; Console.WriteLine(refCollection[0].Value); // 输出 10
2. 利用语言原生的引用特性
有些语言本身支持直接存储引用或指针,比如C++:
#include <vector> #include <functional> // 用于std::reference_wrapper int main() { int x = 5; // 用std::reference_wrapper包装引用,存入集合 std::vector<std::reference_wrapper<int>> refCollection; refCollection.push_back(x); // 修改原变量,集合里的引用会同步更新 x = 10; std::cout << refCollection[0].get() << std::endl; // 输出 10 return 0; }
再比如Python,虽然基础值类型(int、str)是不可变的,但你可以用可变容器(比如列表)来间接实现引用效果:
ref_collection = [] x = [5] # 用列表包装int,列表是引用类型 ref_collection.append(x) # 修改原列表里的值,集合里的项同步变化 x[0] = 10 print(ref_collection[0][0]) # 输出 10
关键思路总结
核心逻辑很简单:让集合存储的是引用类型的实例(或引用本身)。如果是值类型,就用引用类型(类、可变容器)把它包装起来,这样集合里保存的就不是副本,而是指向原对象的引用,修改原对象时集合里的内容也会跟着改变。
内容的提问来源于stack exchange,提问作者LagunaLoire
相关产品推荐
相关产品推荐

