C# 手动收集垃圾?

C# 手动收集垃圾?,c#,manual,garbage,C#,Manual,Garbage,结果是我失去了对包含“Bob”的实例的引用。如果我不想依赖c#的GC,我如何在重新分配p指向James之前删除这个实例?只是为了避免额外的垃圾。你不能。您只能要求GC执行收集,但无法说它将实际接收您的对象(也不能要求GC仅收集一个对象) 强制立即对所有代进行垃圾收集 除非你有很好的理由(看起来你没有),否则你不应该这样做。通过调用Collect强制垃圾收集是可能的,但大多数情况下,这应该避免,因为它可能会产生性能问题 从这里开始:您可以重用实例,而不是替换它: Person p = new P

结果是我失去了对包含“Bob”的实例的引用。如果我不想依赖c#的GC,我如何在重新分配p指向James之前删除这个实例?只是为了避免额外的垃圾。

你不能。您只能要求GC执行收集,但无法说它将实际接收您的对象(也不能要求GC仅收集一个对象)

强制立即对所有代进行垃圾收集


除非你有很好的理由(看起来你没有),否则你不应该这样做。

通过调用Collect强制垃圾收集是可能的,但大多数情况下,这应该避免,因为它可能会产生性能问题


从这里开始:

您可以重用实例,而不是替换它:

Person p = new Person("Bob", 10);
p = new Person("James", 20);
这样,就不会有您松散引用的Bob实例


但是,为了代码可读性和避免潜在的错误,您不应该以这种方式重用变量。

不要这样编写代码,在失去引用之前处理对象。有一个特殊的“DEL”大多数键盘上的按钮-只需从源代码中删除额外的创建:)…如果您不想依赖GC,唯一的选择是选择C#以外的内容。虽然这个问题更多的是因为对对象生命周期的误解或错误的期望。“在重新分配之前,
p
包含对对象的引用。。。是否希望
p
引用非对象?如果您想要“未定义的行为”和程序崩溃,您应该尝试使用C/C++。我对Bob执行了一些操作,然后我需要处理它并对jams执行一些操作。显然,这是一个非常简单的例子,我不能“删除”这两行,因为它们是必需的@AlexeiLevenkov.这很奇怪:/我确实有一个对堆内存地址的引用。我应该能够在将指针p指向另一个实例之前清除它。不,您没有对内存地址的引用。您有一个对对象的引用。在C/C++中,它与指针的想法并不完全相同(但这是一个需要更长时间讨论的主题)。你甚至不应该费心去想那件事。这就是垃圾收集的美妙之处。这就是.NETFramework的工作原理。如果你需要/想做这样的事情,使用C++或C++. 1。NoBo编码器——我认为你想用C++编写代码,而不是C语言——你将在更为宽松的环境下,以这种方式获得手动内存管理的所有优点和缺点。GC运行时通常没有办法进行手动清理,特别是对于单个对象(.Net、Java、JavaScript…),这是我没有想到的。重复使用应该有效,谢谢!
Person p = new Person("Bob", 10);

p.Name = "James";
p.Number = 20;