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

本文关键字:关键字 对象 new | 更新日期: 2023-09-27 18:02:03

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

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

由于引用被重用,垃圾收集器是否在'Red Car'丢失其引用后处置/处理它?或者是否需要实现一个单独的方法来处理"红色汽车"?

我主要想知道,因为我要回收一个相对较大的对象,并且需要知道当它被重新创建时是否应该做些什么

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

在您的示例中,当将c分配给Blue Car时,cRed Car实例将有资格进行垃圾收集。你不需要做任何事。

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

第一段说明了一切:

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

由于引用被重用,垃圾收集器是否在'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将在将来的某个时候"收集"任何这些没有指向活动对象的引用链的对象。对于大多数任务,只要使用托管的数据,就不应该担心大对象与小对象的区别。

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

创建一个新对象,并将其引用赋值给变量c。与此同时,前面的对象("red car")现在不再被引用,并且可能被垃圾收集。

如果没有其他对Red car的引用,它将在GC的下一个循环中被收集。你不需要任何额外的东西(除非它是一个类,有流等需要处理)

垃圾收集器将在红色汽车不再扎根(不可访问)时处理清理。作为开发人员,您通常不必担心在。net中清理内存。

有三个需要注意的地方:

    这不会马上发生。垃圾收集将在发生时发生。你无法预测。
  1. 如果该类型实现了IDisposable,则由您来确保调用. dispose()方法。using语句是完成此任务的好方法。
  2. 你说过这是一个很大的物体。如果它超过85000字节,它将存储在一个称为大对象堆的地方,它有非常不同的垃圾收集规则。允许频繁地回收这类对象可能会导致问题。

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

GC将拾取您的Red Car对象并处理它。

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

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

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

public class car : IDispose