C# 在C中轻推垃圾收集器#

C# 在C中轻推垃圾收集器#,c#,garbage-collection,C#,Garbage Collection,可能重复: 是否有人知道是否显式取消引用对象 finalResults = null; 给垃圾收集器更多的清理空间?我有一个相当大的物体(不是很大,但足够大,我不想让它在使用后停留太久) 上面的代码是有用的还是毫无意义的?我特别避免与GC本身进行编程对话,我只需要知道上面的内容是否会对它起到任何提示/提示的作用。检查生成的IL;您可能会发现编译器知道变量永远不会再次被引用,因此不必为该行生成任何代码,在这种情况下,您知道不会有行为上的差异。不要花费任何时间将变量设置为null。它不会“轻推

可能重复:

是否有人知道是否显式取消引用对象

 finalResults = null;
给垃圾收集器更多的清理空间?我有一个相当大的物体(不是很大,但足够大,我不想让它在使用后停留太久)


上面的代码是有用的还是毫无意义的?我特别避免与GC本身进行编程对话,我只需要知道上面的内容是否会对它起到任何提示/提示的作用。

检查生成的IL;您可能会发现编译器知道变量永远不会再次被引用,因此不必为该行生成任何代码,在这种情况下,您知道不会有行为上的差异。

不要花费任何时间将变量设置为null。它不会“轻推”垃圾收集器


拥有GC的全部意义在于,您不需要担心对象的生存期。

将变量设置为null只对C#编译器有价值,它无法自行确定它不会被再次使用

在编写良好的清晰代码中,很少有情况下c#编译器无法跟踪上一次使用局部变量的时间


如果finalResults是一个字段,那么情况就不同了。

据我所知,不太可能

垃圾收集器使用的主要规则(确定是否需要执行收集)是确定Gen-0堆中是否有足够的空间在请求时分配新对象。如果无法分配对象,则执行收集

集合杂乱无章且嘈杂(因为堆压缩、从Gen--0到Gen-1的对象升级以及从Gen-1到Gen-2的对象升级),所以最好让GC去担心它

GC会在需要的时候完成对象,所以不用担心它会无所事事

如果您真的很担心,那么在调试构建中尝试调用

GC.Collect();
您可以将对象设置为Null,看看它有什么影响,但实际上我最好的建议是不要对此失去任何睡眠

Is
finalResults=null无意义

没有足够的信息

  • 如果
    finalResults
    是一个局部变量,那么它就没有意义,甚至可能有害。你只是在干扰优化器

  • 如果它是类成员(属性或字段),那么它可能会很有用。不经常,但如果您有一个时间点,您可以非常确定该值将不再被使用,那么将其设置为null也不会有什么坏处


  • 上面的答案是正确的,但似乎没有人做出这种区分,因此我将:

    这取决于
    最终结果的声明方式。如果它是在方法中声明的局部变量,那么就不会有任何影响;在任何情况下,当方法超出作用域时,它所引用的对象都有资格进行垃圾收集(并且垃圾收集器仍将决定何时清理)


    但是,如果finalResults
    是一个类字段或属性,那么这是一个稍微不同的场景(尽管小的“f”似乎表明它不是)。在这种情况下,它所属的对象将保留对
    finalResults
    引用的对象的引用,直到它本身可以被垃圾回收(反过来,当没有任何对象保留对它的引用时,就会发生这种情况)。在这样的情况下,您可能实际上希望将其设置为null,以允许对象更早地符合GC的条件(假设引用对象仍将存在相当长的时间)

    将变量设置为null完全没有任何作用。这是一个临时变量吗?我认为您可以非常自信,垃圾收集器足够聪明,不会产生任何影响。按照Michael a.Jackson的“优化规则”传统,我在此提出担心垃圾收集的规则:1。不要这样做。2.如果你认为你必须这样做,那就去真正了解它是如何工作的,并且敬畏地站着不动。3.(仅限专家使用)如果您仍然认为需要它,请证明它。这是一个局部变量,而不是字段,对吗?对于字段,这在某些情况下是必要的,对于局部变量,这应该很少必要。这是唯一正确的答案,因为当
    finalResults
    是类成员时,它确实很有用。何时将局部变量设置为null有害?如果在本地设置为null之后没有使用它,那么这肯定没有任何作用。Justin,将其设置为null是一种用途,可能会阻止优化器更早地将其设置为null/丢弃。我们不应该关心对象的生存期。GC将为我们做这件事。如果你非常关心内存,也许你应该考虑一个非托管环境。@亨克:关于类成员的公平点。不要调用<代码> GC。集合()/<代码>除非你真的知道你在做什么。