Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > вопрос о Dispose и FileStream


Автор: -ser- 5.4.2005, 09:28
Создал простенький класс А без какого-либо наследования, который работает с базой данных и файл-стримами.
затем в методах других классов обявляю instance класса А и все работает превосходно, но прочитал мелкомягких о IDisposable.Dispose Methodе:
Цитата
Use this method to close or release unmanaged resources such as files, streams, and handles held by an instance of the class that implements this interface...

да, есть у меня в моем классе А те же файл-стримы, которые я там создаю, читаю и закрываю, и как я понял из вышенаписанного они являются unmanaged resource'ами. Допустим. Hо никакие интерфейсы я не наследовал и не реализовывал. Получается что instancе'ы класса А у меня не освобождаются автоматически при выходе из вызывающих методов?

Автор: mr.DUDA 5.4.2005, 09:32
Сразу по выходу из метода - не освобождаются. Если ссылок на объект А больше нету, он помечается как кандидат на удаление при следующей сборке мусора, а уж когда она будет выполняться - это одному GC известно smile. Так что, ресурсы нужно освобождать явно, т.е. принудительно. Реализовать для этого метод Dispose или нет - личное дело каждого (IDisposable - это скорее соглашение, чем требование).

Автор: -ser- 5.4.2005, 09:56
То есть, если я правильно понял, если это не критически в плане время+ресурсы, то об этом можно с чистой совестью забыть и положиться на GC, а это 99.9% случаев. (я то где-то читал что GC запускается приблизительно каждую ms.)
Цитата
Реализовать для этого метод Dispose или нет-личное дело каждого

получается, IDisposable это предлагаемый способ, но ресурсы можно освобождать и без него?

Автор: mr.DUDA 5.4.2005, 10:02
Если речь идёт о файлах, то "с чистой совестью забыть" может привести к тому, что файл некоторое время останется открытым (и возможно заблокированным, если не был выставлен какой-нибудь из FileShare.xxx при создании FileStream). Каждую миллисекунду GC вроде как не вызывается... хотя точно не уверен smile. Ресурсы можно освобождать без IDisposable, т.к. это лишь предлагаемый ООП-вариант (аналогия с EventArgs и EventHandler - не нравится, не юзай).

Автор: -ser- 5.4.2005, 10:19
насчет файлов, почему он может остаться открытым, если после работы с ним мы его преспокойненько закроем, наверно ты имел ввиду handle на него. да пусть он висит пока мусорщик не придет. А тем временем мы создадим новый instance и соответственно новый handle. И если речь идет не о многопоточности, выходит, ничего смертельного в этом нет.
Насчет GC тоже не буду утверждать, ибо источник не помню.

Автор: mr.DUDA 5.4.2005, 10:29
Цитата(ser @ 5.4.2005, 10:19)
насчет файлов, почему он может остаться открытым, если после работы с ним мы его преспокойненько закроем

Тогда Ok smile
Просто есть люди, которые поработав с объектом потока, "бросают" его, не заботясь о закрытии.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)