C#现有对象上的'new'关键字

时间:2011-07-13 15:23:21

标签: c# object garbage-collection new-operator

我想知道对象(在C#中)发生了什么,一旦它的引用被重新分配。例如:

Car c = new Car("Red Car");
c = new Car("Blue Car");

由于引用被重用,垃圾收集器在丢失引用之后是否处理/处理'Red Car'?或者是否需要采用单独的方法来处理“红色汽车”?

我主要想知道因为我将要回收一个相对较大的对象,并且需要知道在重新创建时是否有任何应该做的事情。

9 个答案:

答案 0 :(得分:35)

在您的示例中,Red Car的{​​{1}}实例在c分配给c时将有资格进行垃圾回收。你不需要做任何事情。

查看有关.NET垃圾收集器的这篇(旧的,但仍然相关)MSDN文章。 http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

第一段说明了一切:

  

Microsoft .NET公共语言运行时环境中的垃圾收集完全免除了开发人员跟踪内存使用情况并知道何时释放内存。

答案 1 :(得分:33)

  

由于引用被重用,垃圾收集器在丢失它的引用之后是否处理/处理'Red Car'?

你可能以错误的方式看待这个:

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")

GC会出现并“收集”这些在将来某个时间点no chain of references to a live object的任何对象。对于大多数任务,只要您使用托管数据,就不必担心大对象与小对象。

对于大多数任务,您只需在处理IDisposable时担心确定性内存管理。只要您遵循using - 块的最佳实践,您通常就可以了。

答案 2 :(得分:7)

您创建一个新对象并将其引用分配给您的变量c。与此同时,前一个对象(“红色汽车”)现在不再被引用,可能被垃圾收集。

答案 3 :(得分:6)

如果没有其他参考红色汽车,GC将在下一个周期收集它。你不需要任何额外的东西(除非它是一个需要处理流等的类)

答案 4 :(得分:5)

当红色汽车不再有根(无法到达)时,垃圾收集器将处理红色汽车的清理。开发人员通常不必担心在.Net中清理内存。

需要提及三个警告:

  1. 不会马上发生。垃圾收集会在发生时发生。你无法预测它。
  2. 如果类型实现了IDisposable,则由您来确保调用.Dispose()方法。 using语句是实现此目的的好方法。
  3. 你提到它是一个大对象。如果它超过85000字节,它将存储在一个名为Large Object Heap的地方,它对垃圾收集有着截然不同的规则。允许经常回收这种物体会导致问题。

答案 5 :(得分:0)

垃圾收集器将负责处理Car对象

答案 6 :(得分:0)

GC将获取您的Red Car对象并将其丢弃。

如果在不再使用原始对象时需要释放资源,则可以调用自定义析构函数或实现IDisposable。

答案 7 :(得分:0)

如果Car拥有一些本机资源,您需要实现IDisposable并在重用变量之前正确处理它。

答案 8 :(得分:0)

我认为你应该实现IDispose接口来清理非托管资源

public class car : IDispose