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

Mik*_*ike 34 c# garbage-collection object new-operator

我想知道一旦对象被重新分配,对象(在C#中)会发生什么.例:

Car c = new Car("Red Car");
c = new Car("Blue Car");
Run Code Online (Sandbox Code Playgroud)

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

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

Ric*_*ett 36

在您的示例中,将在分配时将符合垃圾收集条件的Red Car实例.你不需要做任何事情.ccBlue Car

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

第一段说明了一切:

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

  • @Richard:我不会说它被"处理掉",因为这意味着如果定义了`IDisposable.Dispose`方法将被调用,但事实并非如此.这样做会产生误导.另外,我认为你对第一段的引用也有点误导."IDiposable"也是GC过程的一个重要部分,因此虽然对于纯托管类型来说该段落是正确的,但_完全绝对是非常误导那些会偶然发现你的答案的人. (7认同)

use*_*116 33

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

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

c [*] ----> [Car { Name = "Red Car" }]  // Car c = new Car("Red Car")
Run Code Online (Sandbox Code Playgroud)

然后你的下一步:

c [*]       [Car { Name = "Red Car"  }] // No chain of references to this object
   \------> [Car { Name = "Blue Car" }] // c = new Car("Blue Car")
Run Code Online (Sandbox Code Playgroud)

GC将会出现并"收集"任何这些对象,这些对象在将来的某个时刻没有对活动对象的引用链.对于大多数任务,只要您使用托管数据,就不必担心大对象与小对象.

对于大多数任务,您只需要在处理时担心确定性内存管理IDisposable.只要你遵循using-blocks 的最佳实践,你通常会没事的.

  • 请注意,对象是否具有*引用*不是GC正在检查的内容.GC正在检查是否存在从已知存在的对象*的引用路径.一个对象可能有一些东西的引用,但是如果那个东西本身已经死了,那么该引用就不算数了. (12认同)

Bro*_*ass 7

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


Can*_*ğlu 6

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


Joe*_*orn 5

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

需要提到三个警告:

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