Где убрать неуправляемый ресурс в шаблоне dispose? - PullRequest
0 голосов
/ 18 марта 2019

Я запутался в этом паттерне.

Если утилизация имеет значение true (вызывается из Dispose ()), мы освобождаем управляемые объекты там. Если утилизация имеет значение false (вызывается из Finalizer ()), доступ к ссылочному объекту небезопасен, эти ссылочные объекты являются неуправляемыми объектами, такими как файловый поток.

Если уничтожение верно, то мы не сможем освободить неуправляемые объекты? Если удаление является ложным, мы не сможем освободить управляемые объекты?

При поиске этого шаблона в методе Dispose (boolean) реализована другая реализация. Реализация MSDN

А этот я получил из примеров и уроков.

protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Free any other managed objects here.
            }
            else
            {
                //not safe to access referenced object
            }
            // Free any unmanaged objects here.
        }
        disposed = true;
    }

Ответы [ 2 ]

1 голос
/ 18 марта 2019

В правильно сформированном шаблоне IDisposable true значение disposing подразумевает, что мы достигли метода из явного вызова Dispose или оставив область действия using, которая является предпочтительным способом потребления IDisposable.Однако не все потребители реализованы должным образом, и для того, чтобы мы могли вернуть все неуправляемые ресурсы в реализации IDisposable, мы называем Dispose(false) из финализатора.Таким образом, false в Dispose указывает, что мы достигли этого вызова на этапе завершения, и некоторые ссылки могут быть недоступны на этом этапе, поэтому мы используем этот флаг - чтобы различать, что мы можем сделать при нормальном выполнении потока и что мы можем сделатьв условиях этапа финализации.Неуправляемые ресурсы мы освобождаем независимо от этого флага.

1 голос
/ 18 марта 2019

очистка неуправляемых ресурсов должна выполняться внутри метода Dispose(boolean disposing) независимо от значения параметра disposing.Вы можете найти подробнее здесь

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