如何在for循环中保留目标对象引用?无需深拷贝且避免对象回收
问题解答
1. 无需深拷贝,直接保存对象引用即可实现需求
完全可以不用深拷贝,直接通过保存对象的引用(内存地址)来实现。因为在C#中,MyObject作为引用类型,变量存储的是对象在堆上的内存地址,而非对象本身。你只需要在循环外部声明一个变量,用来记录当前属性值最高的对象引用即可。
修改后的代码示例:
MyObject bestObj = null; int highestAttribute = 0; // 初始化基准值 for (int k = 0; k < 10; k++) { MyObject obj = new MyObject(); obj.Method1(); // 执行方法生成随机属性值 // 比较当前对象属性与记录的最高值 if (obj.Attribute > highestAttribute) { highestAttribute = obj.Attribute; bestObj = obj; // 保存当前对象的引用 } } // 循环结束后访问最优对象的属性 if (bestObj != null) { Console.WriteLine($"最高属性值: {bestObj.Attribute}"); // 其他操作... }
这里的bestObj只是保存了符合条件的obj的内存地址,并没有复制对象本身,完全不需要深拷贝。
2. 防止对象被GC回收的方法
.NET的垃圾回收器(GC)只会回收没有任何活跃引用指向的对象。所以要防止对象被回收,只需要确保有至少一个变量(或集合元素)持有该对象的引用:
- 如果需要保留所有循环中创建的对象,可以在循环外声明一个集合(比如
List<MyObject> allObjs = new List<MyObject>();),每次创建对象后执行allObjs.Add(obj);,这样所有对象的引用都被集合持有,GC不会回收它们。 - 如果只需要保留最优的那个对象,像上面代码中那样用
bestObj持有它的引用即可,这个对象不会被回收,而其他没有被引用的对象会被GC自动清理(这是正常的内存管理行为,不需要特意阻止)。
内容的提问来源于stack exchange,提问作者P.oulpi
相关产品推荐
相关产品推荐

