IDisposable шаблон: я должен аннулировать переменные, когда GC.SupressFinalizer - PullRequest
0 голосов
/ 21 декабря 2011

Каждый раз, когда я вызываю GC.SupressFinalizer () в методе Dispose, я должен назначить null всем членам экземпляра для их очистки, или они будут удалены в любом случае?

Например:

class test : IDisposable
{ 
    public int a = 10;
    public int b = 20;
    public int c = 39;

    private bool is_disposed = false;

    Dispose(bool shall_dispose)
    {
        if(!is_disposed && shall_dispose)
        {
            is_disposed = true;

            // shall I annulate a, b & c or they will be freed anyway??
            // a = null; ?, integers aint nullable 
            // b = null; ?
            // c = null; ?

            // or primitive types should't be annulated? only reference(heap) types?
        }
    }

    Dispose()
    {
        Dispose(true);
    }

    ~test()
    {
        Dispose(false);
    }
}

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

GC.SupressFinalizer () не остановит сбор вашего объекта, когда он более недоступен, он просто прекратит вызов финализатора объекта.Таким образом, и ваш объект, и его члены будут собраны, независимо от того, назначен ли вам ноль или нет.

1 голос
/ 21 декабря 2011

Цель IDisposable.Dispose - уведомить объект о том, что он больше не нужен, и должен сообщить другим объектам, что им больше не нужно ничего делать от его имени (например, оставить файл открытым, предоставить эксклюзивный доступ).доступ к блоку памяти и т. д.) В большинстве случаев, вскоре после того, как объект Dispose'd, любые ссылки на него будут заброшены, объект станет пригодным для сбора мусора, а его удерживающие ссылки на другие объекты не будутзадержать их сборку мусора.Тем не менее, очистка других ссылок может быть хорошей идеей.Вполне возможно, что ссылка может оставаться на объекте долго после вызова Dispose.Кроме того, возможно, что объект IDisposable мог существовать достаточно долго, чтобы достичь поколения 2 в сборщике мусора, а это означает, что сборщику мусора может потребоваться какое-то время, чтобы он даже посмотрел на него снова.Если он содержит ссылки на объекты, созданные недавно, его нулевые значения могут позволить собирать эти объекты раньше, чем в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...