对象的 属性 是用 C# 中的对象进行垃圾回收,还是它们有单独的 gc 机制

Is object's property be garbage collected with object in C#, or they have separate gc mechanism

我只是在想一个问题,如果 class 像:

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 才被收集收集到了吗?

通过这个例子,我们可以说 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