Собирается ли модель вида сборщиком мусора? Как я мог проверить? - PullRequest
0 голосов
/ 13 января 2020

У меня есть такой код:

public class ViewModel01
{
    public ObservableCollection<MyType> MyProperty;
}

Public class ViewModel02
{
    ObservableCollection<MyType> MyProperty;


    Public ViewModel02()
    {
        ViewModel01 myViewModel = new ViewModel01;
        MyProperty = myViewModel01.MyProperty;
    }
}

Я сомневаюсь, что если в конструкторе модели второго представления объект myViewModel повторно вызывается сборщиком мусора или он все еще остается живым, в то время как ViewModel02 все еще жив потому что у меня есть ссылка на свойство модели представления 01. Или, возможно, модель представления 01 собрана, потому что на самом деле у меня есть ссылка на ObservableCollection, а не на модель представления 01, поэтому модель представления может быть собрана сборщиком мусора.

Кроме того, я хотел бы знать, есть ли какой-нибудь способ проверить, собран один объект или нет. Я использую сообщество Visual Studio 2019.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 января 2020

Если вы действительно хотите знать, не протекаете ли вы с какого-либо предмета, вы можете попробовать отследить текущий счетчик вручную; обычно работает нечто простое, подобное следующему:

class Foo
{
    static int s_liveCount;
    Foo() => Interlocked.Increment(ref s_liveCount);
    ~Foo() => Interlocked.Decrement(ref s_liveCount);
    public static int LiveCount => Thread.VolatileRead(ref s_liveCount);
}

Это только говорит о типе в целом ; отслеживать отдельные объекты сложнее, потому что в тот момент, когда вы пытаетесь - вы как бы останавливаете его сбор, если только вы не go ориентировочно через WeakReference, et c.

1 голос
/ 13 января 2020

Да, myViewModel01 должен быть собран G C, потому что на него нет ссылок. Наблюдаемая коллекция не собирается, так как ViewModel02 содержит ссылку на нее.

Вы можете проверить это следующим образом:

public class ViewModel01
{
    private readonly Guid _id;

    public ViewModel01()
    {
        _id = Guid.NewGuid();
        Console.WriteLine($"Constructing {_id}");
    }

    ~ViewModel01()
    {
        Console.WriteLine($"Destructing {_id}");
    }

    public ObservableCollection<MyType> MyProperty;
}

static void Main(string[] args)
{
    var model102 = new ViewModel02();
    GC.Collect(); // Force GC to collect garbage
    Console.ReadKey();
}

В выводе вы увидите, что это ViewModel01 было построено и затем уничтожен.

...