Является ли свойство объекта сборщиком мусора с объектом в C #, или у них есть отдельный механизм gc - PullRequest
0 голосов
/ 26 апреля 2019

Я просто подумываю над вопросом, что если есть класс вроде:

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

и я создаю его экземпляр:

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

, тогда я задаю PropertyAравным нулю, например a.PropertyA = null;, будет ли значение PropertyA собираться мусором или не будет собираться до тех пор, пока объект a не будет собран?

1 Ответ

0 голосов
/ 26 апреля 2019

С помощью этого примера мы можем сказать, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...