Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сборка мусора .NET 
:(
    Опции темы
ChiciucMaxim
Дата 7.9.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 22.6.2008

Репутация: -1
Всего: нет



У меня вопрос из области сборки мусора. А именно мне не понятно является ли объект типа FileStream, StreamWriter, StreamReader неуправлемым? Следует для них в финализаторе использовать метод Close()? 
PM MAIL   Вверх
source777
Дата 7.9.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(ChiciucMaxim @  7.9.2008,  14:31 Найти цитируемый пост)
является ли объект типа FileStream, StreamWriter, StreamReader неуправлемым? 
Да.


Цитата(ChiciucMaxim @  7.9.2008,  14:31 Найти цитируемый пост)
Следует для них в финализаторе использовать метод Close()?  
Да, если они не закрываются ранее, предпочтительнее закрывать ресурсы как можно быстрее, используй блок using с этой целью.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
PashaPash
Дата 11.9.2008, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Цитата(ChiciucMaxim @  7.9.2008,  14:31 Найти цитируемый пост)
является ли объект типа FileStream, StreamWriter, StreamReader неуправлемым

Нет, в .net все объекты - управляемые. Они сами реализуют Dispose/Finalize и сами вполне нормально освобождают свои ресурсы. Но финализаторы - вещь непредсказуемая, поэтому лучше всегда вызывать Close(), или использовать эти типы в using.
Цитата(ChiciucMaxim @  7.9.2008,  14:31 Найти цитируемый пост)
Следует для них в финализаторе использовать метод Close()

Ни в коем случае. Финализаторы нужно использовать только для работы с неуправляемыми ресурсами.


--------------------
PM MAIL WWW   Вверх
source777
Дата 11.9.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



2PashaPash C каких пор файлы и потоки ОС стали управляемыми?


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
archeg
Дата 11.9.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



FileStream, StreamWriter, StreamReader - это управляемые обертки неуправляемых ресурсов.

Финализаторы - очень предсказуемая вещь, где тут непредсказуемость? smile читай Рихтера


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
PashaPash
Дата 11.9.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Цитата(source777 @  11.9.2008,  11:39 Найти цитируемый пост)
C каких пор файлы и потоки ОС стали управляемыми? 

С каких пор FileStream, StreamWriter, StreamReader - это файлы и потоки ОС??? С каких пор в винде вообще есть потоки? 
Неуправляемые файлы - это HFILE и HANDLE, полученные через OpenFile/CreateFile. FileStream - это стандартная управляемая обертка над ними, позволяющая работать с ними как с Stream. Она берет на себя всю работу по управлению неуправляемыми ресурсами. 
А StreamWriter и StreamReader - это вообще чисто managed вещи, просто реализация TextReader/Writer для работы с потоком.

И так, на всякий случай - вызывая из финализатора Dispose у других управляемых объектов можно получить очень-очень тяжелоотлаживаемые проблемы.

Добавлено через 5 минут и 54 секунды
Цитата(archeg @  11.9.2008,  13:43 Найти цитируемый пост)
Финализаторы - очень предсказуемая вещь, где тут непредсказуемость? smile читай Рихтера 

Порядок вызова непредсказуем, а не общее поведение финализаторов. Да и при завершении приложения финализаторы себя забавно ведут. Да и Рихтер недоговаривает очень часто - он же не msdn.


--------------------
PM MAIL WWW   Вверх
source777
Дата 11.9.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(PashaPash @  11.9.2008,  13:44 Найти цитируемый пост)
FileStream - это стандартная управляемая обертка над ними, позволяющая работать с ними как с Stream.
Вот именно, что обёртка.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
PashaPash
Дата 11.9.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Цитата(source777 @  11.9.2008,  15:59 Найти цитируемый пост)
Вот именно, что обёртка.

Вот именно обертка - управляемый объект, который полностью инкапсулирует работу с неуправляемыми файлами OS. "Полностью" означает что обертка сама управляет всеми неуправляемыми ресурсами, полностью скрывает детали управления ими от пользователя, и реализует паттерн Dispose/Finalize. Это значит, что ее финализатор будет вызват независимо от финализатора твоего объекта.

Это сообщение отредактировал(а) PashaPash - 11.9.2008, 18:45


--------------------
PM MAIL WWW   Вверх
source777
Дата 11.9.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(PashaPash @  11.9.2008,  18:44 Найти цитируемый пост)
Это значит, что ее финализатор будет вызват независимо от финализатора твоего объекта.
Вызван то он будет, только весь вопрос в том когда именно? причём важнее не финализатор, а Dispose(). Потому и блоки using используют, чтобы неявно побыстрее вызвать Dispose() и освободить ресурс. А метод Close() в данном случае лишь псевдоним Dispose().



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
PashaPash
Дата 12.9.2008, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Цитата(source777 @  11.9.2008,  22:27 Найти цитируемый пост)
Вызван то он будет, только весь вопрос в том когда именно? причём важнее не финализатор, а Dispose(). Потому и блоки using используют, чтобы неявно побыстрее вызвать Dispose() и освободить ресурс.

Перечитай внимательно первый пост, и мой ответ на него. Топикастер задал вопрос: нужно ли вызвать Close для FileStream, StreamWriter, StreamReader в финализаторе класса [который их использует]. Правильный ответ на него: нет, ни в коем случае. По той причине, что эти классы вызывают Close в своих собственных финализаторах. А совсем правильный ответ - в классе вообще не должно быть полей этих типов, такие вещи надо выбрасывать сразу после использования.

На всякий случай - финализатор - это finalizer, он же ~ClassName а не блок try/finally.
Цитата(source777 @  11.9.2008,  22:27 Найти цитируемый пост)
А метод Close() в данном случае лишь псевдоним Dispose().
Кстати, для FileStream, и вообще всех наследников Stream нужно вызывать именно Close (если не используется using). Исторически так сложилось.


--------------------
PM MAIL WWW   Вверх
source777
Дата 15.9.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(PashaPash @  12.9.2008,  01:07 Найти цитируемый пост)
А совсем правильный ответ - в классе вообще не должно быть полей этих типов, такие вещи надо выбрасывать сразу после использования.
Ну хоть в чём-то ты со мной согласился.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0979 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.