![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
ChiciucMaxim |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 22.6.2008 Репутация: -1 Всего: нет |
У меня вопрос из области сборки мусора. А именно мне не понятно является ли объект типа FileStream, StreamWriter, StreamReader неуправлемым? Следует для них в финализаторе использовать метод Close()?
|
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Да, если они не закрываются ранее, предпочтительнее закрывать ресурсы как можно быстрее, используй блок using с этой целью. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Нет, в .net все объекты - управляемые. Они сами реализуют Dispose/Finalize и сами вполне нормально освобождают свои ресурсы. Но финализаторы - вещь непредсказуемая, поэтому лучше всегда вызывать Close(), или использовать эти типы в using. Ни в коем случае. Финализаторы нужно использовать только для работы с неуправляемыми ресурсами. |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
2PashaPash C каких пор файлы и потоки ОС стали управляемыми?
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
FileStream, StreamWriter, StreamReader - это управляемые обертки неуправляемых ресурсов.
Финализаторы - очень предсказуемая вещь, где тут непредсказуемость? ![]() -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет ![]() И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
С каких пор FileStream, StreamWriter, StreamReader - это файлы и потоки ОС??? С каких пор в винде вообще есть потоки? Неуправляемые файлы - это HFILE и HANDLE, полученные через OpenFile/CreateFile. FileStream - это стандартная управляемая обертка над ними, позволяющая работать с ними как с Stream. Она берет на себя всю работу по управлению неуправляемыми ресурсами. А StreamWriter и StreamReader - это вообще чисто managed вещи, просто реализация TextReader/Writer для работы с потоком. И так, на всякий случай - вызывая из финализатора Dispose у других управляемых объектов можно получить очень-очень тяжелоотлаживаемые проблемы. Добавлено через 5 минут и 54 секунды
Порядок вызова непредсказуем, а не общее поведение финализаторов. Да и при завершении приложения финализаторы себя забавно ведут. Да и Рихтер недоговаривает очень часто - он же не msdn. |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Вот именно обертка - управляемый объект, который полностью инкапсулирует работу с неуправляемыми файлами OS. "Полностью" означает что обертка сама управляет всеми неуправляемыми ресурсами, полностью скрывает детали управления ими от пользователя, и реализует паттерн Dispose/Finalize. Это значит, что ее финализатор будет вызват независимо от финализатора твоего объекта. Это сообщение отредактировал(а) PashaPash - 11.9.2008, 18:45 |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Перечитай внимательно первый пост, и мой ответ на него. Топикастер задал вопрос: нужно ли вызвать Close для FileStream, StreamWriter, StreamReader в финализаторе класса [который их использует]. Правильный ответ на него: нет, ни в коем случае. По той причине, что эти классы вызывают Close в своих собственных финализаторах. А совсем правильный ответ - в классе вообще не должно быть полей этих типов, такие вещи надо выбрасывать сразу после использования. На всякий случай - финализатор - это finalizer, он же ~ClassName а не блок try/finally. Кстати, для FileStream, и вообще всех наследников Stream нужно вызывать именно Close (если не используется using). Исторически так сложилось. |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |