对象的属性是与C#中的对象一起被垃圾回收,还是它们具有单独的gc机制

时间:2019-04-26 10:37:57

标签: c# garbage-collection

我只是在考虑一个问题,如果有这样的课程:

public class A 
{
    public CustomType PropertyA { get; set; }
    public CustomType PropertyB { get; set; }
}

然后创建一个实例:

var a = new A 
{
    PropertyA = SomeValue,
    PropertyB = SomeOtherValue
};

然后我将PropertyA设置为null,就像a.PropertyA = null;一样,会PropertyA的值被垃圾回收,还是直到对象a被回收后才被回收?

1 个答案:

答案 0 :(得分:0)

通过这个例子,我们可以说GC对于对象的任何属性实例都是独立工作的。

using System;

public class Dog
{
    public Dog(string name)
    {
        this.Name = name;
    }
    public string Name;
    public Breed Breed;
}

public class Breed
{
    public Breed(string name)
    {
        Name = name;
    }
    public string Name;
}

public class Program
{
    public static void Main()
    {
        Dog dog = new Dog("Bowser");
        dog.Breed = new Breed("Pug");
        WeakReference dogRef = new WeakReference(dog);
        WeakReference breedRef = new WeakReference(dog.Breed);
        Console.WriteLine(dogRef.IsAlive);
        Console.WriteLine(breedRef.IsAlive);

        dog.Breed = null;
        GC.Collect();
        Console.WriteLine(breedRef.IsAlive);

        dog = null;
        GC.Collect();
        Console.WriteLine(dogRef.IsAlive);
    }
}

输出:

true
true
false
false