可能重复:
Garbage Collection: Is it necessary to set large objects to null in a Dispose method?
有没有人知道是否明确取消引用对象;
finalResults = null;
让垃圾收集器更加轻松清理?我有一个相当大的物体(不是很大,但足够大,我不希望它在使用后长时间停留)
上述帮助还是无意义的代码?我特别避免以编程方式与GC本身交谈,我只需要知道上述内容是否会起到任何形式的提示/提示。
答案 0 :(得分:5)
finalResults = null;
毫无意义吗?
信息不足。
如果finalResults
是一个局部变量,那么它是毫无意义的,甚至可能是有害的。你只是在干扰优化器。
如果是类成员(属性或字段),它可能会有用。不经常但是如果你有一个时间点,你可以非常肯定不会再使用该值,那么将它设置为null也不会有什么坏处。
答案 1 :(得分:2)
据我所知,不是真的。
垃圾收集器使用的主要规则(如果需要进行收集,则计算出来)是在Gen-0堆中有足够的空间来分配新对象时要解决的问题。如果它无法分配对象,则会执行集合。
集合很乱并且很嘈杂(因为堆压缩,从Gen-0到Gen-1和Gen-1到Gen-2的对象的升级)所以最好让GC担心它。
GC会在需要时完成您的对象,所以不要担心它会在周围。
如果您真的担心,那么在调试版本中尝试调用
GC.Collect();
你将对象设置为Null,并看看它有什么影响,但我最好的建议是不要对它失去任何睡眠。
答案 2 :(得分:1)
不要花时间将变量设置为null。它没有“轻推”垃圾收集器。
拥有GC的重点在于您无需担心对象的生命周期。
答案 3 :(得分:1)
将变量设置为null只是C#编译器的值无法解决它不能再次使用的问题。
在编写清晰的代码中,当c#编译器无法跟踪上次使用本地变量时,很少有这种情况。
现在,如果finalResults是一个字段,那将是一个不同的情况。
答案 4 :(得分:1)
上面的答案是正确的,但似乎没有人做出这种区分,所以我会:
这取决于finalResults
的声明方式。如果它是在方法中声明的局部变量,那么根本就没有效果;在任何情况下,当方法超出范围时,它引用的对象将有资格进行垃圾收集(并且它仍然由垃圾收集器决定何时清理)。
但是,如果finalResults
是一个类字段或属性,那么情况就会略有不同(尽管小" f"似乎表明它不是)。在这种情况下,它构成一部分的对象将保存对finalResults
引用的对象的引用,直到它本身可以被垃圾收集(这种情况发生在没有任何引用它的情况下,反过来)。在这种情况下,可能实际上想要将其设置为null,以允许该对象更早地符合GC的条件(假设引用对象仍然存在大量的时间)。
答案 5 :(得分:0)
检查生成的IL;您可能会发现编译器知道该变量永远不会被再次引用,因此不需要为该行生成任何代码,在这种情况下,您知道行为不会有差异。