对象的 属性 是用 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
我只是在想一个问题,如果 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