C#:垃圾收集器

时间:2013-06-25 14:30:33

标签: c# garbage-collection

是否有必要这样做poly = null; ?完成功能后,垃圾收集器会清理还是?

这是一个简单的例子:

    public void redrawSingelPoly(Canvas canvas) 
    {
        Polyline poly = new Polyline();
        poly.Stroke = colorBrush;
        poly.StrokeThickness = basicLineThick;

        poly.Points = points;
        canvas.Children.Add(poly);

        poly = null; //Garbage Collector
    }

3 个答案:

答案 0 :(得分:6)

您的多边形对象不会在您的示例中进行垃圾回收。这就是为什么......

您正在执行以下操作...

canvas.Children.Add(poly);

保持对对象的引用。即使你设置了对该对象的本地引用= null,仍然有一个从该方法传出的引用!

垃圾收集器只收集不可缓存的对象。

话虽如此 - 是否有必要设置poly = null?不,没有必要。

答案 1 :(得分:1)

poly设置为null是不必要的,至少有两个原因。

  1. 由于C#(和.net一般)是一个托管内存环境,变量的内存将由垃圾收集器自动完成。

  2. 垃圾收集器不会收集仍在使用的内存,如果canvas.Children属性在范围内,Polyline对象使用的内存也是如此,无论是poly变量的值。

答案 2 :(得分:0)

总的来说,这不是必需的,但是让我感到惊讶的是:

canvas.Children.Add(poly);

这一行。不清楚Add(..)方法中发生了什么。

范围角度GC将找到并收集未被全局引用引用的所有局部变量,因此无法执行=null