Передача Idisposable в качестве параметра - PullRequest
0 голосов
/ 22 октября 2018

Далее я передаю одноразовый объект в качестве параметра в конструктор, затем выполняю несколько операций и все.Конструктор не делает ничего, кроме как устанавливает экземпляр локальной переменной DisposableObject.

Прав ли я, полагая, что одноразовое изделие все равно будет утилизировано даже в результате исключения в вызове Whither ()?

Если бы код находился в цикле for, оба объекта также выходили бы из области видимости и собирали мусор (у меня может быть только один экземпляр этого класса IDisposable в моем Домене приложения).

using (var disposableObject = new DisposableObject()) 
{
    var simpleObject= new Simple(disposableObject);
    simpleObject.Whatever();
}

1 Ответ

0 голосов
/ 22 октября 2018

Просто чтобы уточнить: IDisposable не о сборке мусора, а о более широкой теме управления ресурсами.Простым примером может быть SqlConnection, который предназначен для освобождения соединения с базой данных.Объект SqlConnection по-прежнему находится в памяти и собирается после того, как выходит из области видимости.

Это не поможет решить проблему «один экземпляр на домен приложения», поскольку время жизниобъект не контролируется вами.В лучшем случае вы можете иметь один неразмещенный объект.


Оператор using фактически является блоком try-finally, где всегда выполняется finally, чтобы убедиться, что объект удален.

Этот код:

using(var disposable = new DisposableObject())
{
    ...
}

по сути эквивалентен этому коду:

var disposable = new DisposableObject();

try
{
    ...
}
finally
{
    disposable?.Dispose();
}

Утилита всегда вызывается, если ссылка на объект не потеряна.

...