![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Доброго времени суток!
Не понял как его описывать и как вызывать. Зачем эта функция Dispose() ? Да и зачем он если есть сборщик мусора? Объясните, пожалуйста. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
Чтобы подчищать unamanged-ресурсы, которые сборщиком мусора не подбираются, или могут подбираться слишком поздно. Например, дескрипторы файлов или соединения с БД. Тема обсуждалась неоднократно.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
по поиску деструктор ничего не дало
|
|||
|
||||
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: 9 Всего: 62 |
Когда ты создаёшь в классе обычный деструктор через тильду (~), то он конечно будет вызван сборщиком мусора, но неизвестно в какое время, т.к. будет стоять на очереди у сборщика мусора. В общем это неожиданный деструктор, который фиг знает когда сработает.
Написание деструктора Dispose() наследуя интерфейс IDisposable является лучшим решением, т.к. поддерживается средой исполнения, в частности конструкцией using. Явно указывает программисту о том, что деструктор надо вызвать самостоятельно. Это сообщение отредактировал(а) Ch0bits - 9.10.2006, 22:27 |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
А может проще создать метод который будет подчищать unamanged-ресурсы(не знаю что это правда
Видимо я чего-то не понимаю. |
|||
|
||||
| Ch0bits |
|
||||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: 9 Всего: 62 |
Эх, если бы под рукой была студия, то показал бы пример.
Как раз этот код обычно пишется в методе Dispose(). Ну допустим ты пишешь класс работающий с файлом. В конструкторе ты его открываешь, методами класса что-то в него пишешь. Таким образом открытый файл будет доступен только экземпляру этого класса (потому что открыт). Допустим закрываешь файл в обычном деструкторе (~) и пытаешься обратится к файлу, но ничего не получается. Почему? Потому что этот деструктор неизвестно когда сработает. А если тоже делать с методом Dispose, то можешь написать такую удобную штуку:
Вообще я не мастер объяснять. |
||||
|
|||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
А если вот так:
Или это дело вкуса всё? |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
Elfet, дело в том, что между открытием файла и вызовом Close может быть выброшено исключение, и тогда файл останется висеть на какое-то время. Поэтому правильно так:
Вот вместо всей этой писанины и придумали using и паттерн IDisposable. Фактически, using при компиляции и разворачивается в try..finally. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: 9 Всего: 62 |
В принципе дело вкуса.
Выгода от использования Using и IDisposable в том, что Dispose() будет вызван даже в случае возникновения критической ошибки, т.к. твой файл (соединение с БД, ресурсы ОС и т.п.) обязательно будет закрыт и данные не потеряются. К тому же когда другие программисты видят в классе Dispose(), они сразу понимают, что это деструктор и вызывают его в конце работы. (По крайней мере должны так делать) Добавлено @ 23:00 Void опередил. |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Ок, понял. Спасибо!
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |