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

Поиск:

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


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Доброго времени суток!
Не понял как его описывать и как вызывать. Зачем эта функция Dispose() ? Да и зачем он если есть сборщик мусора? 
Объясните, пожалуйста. smile 


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


λ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
PM MAIL WWW GTalk   Вверх
Elfet
Дата 9.10.2006, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



по поиску деструктор ничего не дало smile


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


Python Dev.
****


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

Репутация: 9
Всего: 62



Когда ты создаёшь в классе обычный деструктор через тильду (~), то он конечно будет вызван сборщиком мусора, но неизвестно в какое время, т.к. будет стоять на очереди у сборщика мусора. В общем это неожиданный деструктор, который фиг знает когда сработает.  smile 
Написание деструктора Dispose() наследуя интерфейс IDisposable является лучшим решением, т.к. поддерживается средой исполнения, в частности конструкцией using. Явно указывает программисту о том, что деструктор надо вызвать самостоятельно.

Это сообщение отредактировал(а) Ch0bits - 9.10.2006, 22:27
PM WWW   Вверх
Elfet
Дата 9.10.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



А может проще создать метод который будет подчищать unamanged-ресурсы(не знаю что это правдаsmile ) или ещё что. А сам объект оставлять сборщику мусора. Уж слишком геморойным мне кажеться этот способ с IDisposable smile 
Видимо я чего-то не понимаю.


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


Python Dev.
****


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

Репутация: 9
Всего: 62



Эх, если бы под рукой была студия, то показал бы пример.

Цитата(Elfet @  9.10.2006,  23:29 Найти цитируемый пост)
А может проще создать метод который будет подчищать unamanged-ресурсы

Как раз этот код обычно пишется в методе Dispose().

Ну допустим ты пишешь класс работающий с файлом. В конструкторе ты его открываешь, методами класса что-то в него пишешь. Таким образом открытый файл будет доступен только экземпляру этого класса (потому что открыт).
Допустим закрываешь файл в обычном деструкторе (~) и пытаешься обратится к файлу, но ничего не получается. Почему? Потому что этот деструктор неизвестно когда сработает. А если тоже делать с методом Dispose, то можешь написать такую удобную штуку:
Код

using (WorkWithFile F = new WorkWithFile("File.txt"))
{
    F.DoSomething();
}
// После этого F гарантированно не существует.


Вообще я не мастер объяснять.  smile 
PM WWW   Вверх
Elfet
Дата 9.10.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



А если вот так:
Код

WorkWithFile F = new WorkWithFile("File.txt");

F.DoSomething();
F.Close(); //и усё? :) а когда там деструктор сработает - всё равно


Или это дело вкуса всё?


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


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Elfet, дело в том, что между открытием файла и вызовом Close может быть выброшено исключение, и тогда файл останется висеть на какое-то время. Поэтому правильно так:
Код
File f = new File("file.txt");
try
{
    // do anything you want
}
finally
{
    f.Close();
}

Вот вместо всей этой писанины и придумали using и паттерн IDisposable. Фактически, using при компиляции и разворачивается в try..finally.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ch0bits
Дата 9.10.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


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

Репутация: 9
Всего: 62



В принципе дело вкуса.
Выгода от использования Using и IDisposable в том, что Dispose() будет вызван даже в случае возникновения критической ошибки, т.к. твой файл (соединение с БД, ресурсы ОС и т.п.) обязательно будет закрыт и данные не потеряются. К тому же когда другие программисты видят в классе Dispose(), они сразу понимают, что это деструктор и вызывают его в конце работы. (По крайней мере должны так делать)

Добавлено @ 23:00 
Void опередил.  smile 
PM WWW   Вверх
Elfet
Дата 9.10.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Ок, понял. Спасибо! smile


--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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