Часто объект IDisposable
блока using
сам создается из другого объекта IDisposable
, например
using (FileStream stream = File.Open(path, FileMode.Open))
using (MyObject obj = new MyObject(stream))
{
// do something with obj
}
К сожалению, приведенный выше код сохраняет поток файлов открытым, пока не будет удален объект MyObject
.
Чтобы избавиться от файлового потока, как только завершится конструктор MyObject
, я мог бы вместо этого написать:
MyObject CreateMyObject(string path)
{
using (FileStream stream = File.Open(path, FileMode.Open))
{
return new MyObject(stream);
}
}
using (MyObject obj = CreateMyObject(path))
{
// do something with obj
}
Но мне не нравится многословие этого решения. Я попытался заменить CreateMyObject()
на лямбду, но мне не удалось найти допустимый синтаксис. Есть ли способ сделать это без вызова пользовательской функции создателя?
Редактировать: Имея в виду некоторые комментарии, я должен отметить, что я стараюсь избегать try
... finally
- своего рода главная причина для блока using
в первую очередь.
Дополнительные пояснения: объект MyObject создается из информации в потоке - то есть его конструктор считывает содержимое потока в его целостности. Ни один другой метод в MyObject не ссылается на поток. Содержимое потока может поступать откуда угодно - файл, ресурс, интернет-сокет и т. Д.