我想知道当一个对象的引用被重新分配时(在C#中),会发生什么。例如:
Car c = new Car("Red Car");
c = new Car("Blue Car");
由于引用被重复使用,当'Red Car'失去其引用时,垃圾回收器是否会处理/处置它?还是需要实现一个单独的方法来处理'red car'?
我主要是想知道,因为我将要回收一个相对较大的对象,当它被重新创建时是否需要进行任何操作。
我想知道当一个对象的引用被重新分配时(在C#中),会发生什么。例如:
Car c = new Car("Red Car");
c = new Car("Blue Car");
由于引用被重复使用,当'Red Car'失去其引用时,垃圾回收器是否会处理/处置它?还是需要实现一个单独的方法来处理'red car'?
我主要是想知道,因为我将要回收一个相对较大的对象,当它被重新创建时是否需要进行任何操作。
在你的示例中,当 c
被分配给 Blue Car
时,c
的 Red Car
实例将变得可回收。您不需要做任何操作。
查看这篇(虽然有些过时但仍然相关)关于.NET垃圾收集器的MSDN文章。http://msdn.microsoft.com/en-us/magazine/bb985010.aspx
第一段话已经说明了一切:
在 Microsoft .NET 公共语言运行时环境中的垃圾收集器完全无需开发人员跟踪内存使用情况或知道何时释放内存。
c [*] ----> [Car { Name = "Red Car" }] // Car c = new Car("Red Car")
然后你的下一步:
c [*] [Car { Name = "Red Car" }] // No chain of references to this object
\------> [Car { Name = "Blue Car" }] // c = new Car("Blue Car")
IDisposable
时才需要关注确定性内存管理。只要遵循using
块的最佳实践,通常就不会出现问题。垃圾收集器将负责处理汽车对象的处理
垃圾回收器将会回收你的红色汽车
对象并进行处理。
如果你有需要在原始对象不再使用时释放的资源,你可以调用自定义析构函数或实现IDisposable接口。
如果 Car
持有一些本地资源,您需要实现 IDisposable
并在重用变量之前正确处理它。
我认为你应该实现IDispose接口来清理非托管资源
public class car : IDispose
Dispose
可能是值得的。 - Phil GanIDisposable.Dispose
方法,则会调用该方法,但事实并非如此。这会给人们带来误导。另外,我认为你引用的第一段也有点误导性。IDisposable
也是GC过程中重要的一部分,因此,虽然该段落对于纯托管类型来说是正确的,但是对于那些看到你的答案的人来说,“完全免除”的说法是非常误导人的。 - Andy