![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Idsa |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Рассмотрим два куска кода:
и
В первом случае Dispose() не выполнится. А вот выполнится ли он во втором куске кода? |
||||
|
|||||
altarvic |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 2.3.2007 Репутация: 1 Всего: 1 |
да (даже в случае эксцепшена внутри блока)
Это сообщение отредактировал(а) altarvic - 24.4.2008, 15:10 |
|||
|
||||
vponomarov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 11.8.2007 Где: Киев Репутация: 4 Всего: 12 |
Idsa, в первом случае Dispose() не выполнится т.к. он стоит после return
![]() хотя может просто опечатка... |
|||
|
||||
Wanderer2019 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 937 Регистрация: 3.12.2004 Где: Санкт-Петербург/П рага Репутация: 7 Всего: 17 |
А в случае А при выходе из метода разве Dispose не должен сам выполняться??? или в данном случае зависит от описания класса SomeType?
|
|||
|
||||
mullih |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 19.12.2006 Репутация: нет Всего: 2 |
Да если ты SomeType расширишь от интерфеса IDisposable иначе нет или поидее не должно
кстати и в первом случае тоже самое и Dispose не надо выывать в ручную. Он вызывется во время сбора мусора сам. Один нюанс ты не знаеь заранее когда это произойдет за исключением если сам не заставишь дотНет собрать его Это сообщение отредактировал(а) mullih - 24.4.2008, 16:04 |
||||||
|
|||||||
Wanderer2019 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 937 Регистрация: 3.12.2004 Где: Санкт-Петербург/П рага Репутация: 7 Всего: 17 |
А разве GC не должен сгребать весь мусор, на который больще ничего не ссылается?
В данном случае MyType - это локальная переменная и при выходе из метода необходимость в ней отпадает. Это сообщение отредактировал(а) Wanderer2019 - 24.4.2008, 16:08 |
|||
|
||||
mullih |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 19.12.2006 Репутация: нет Всего: 2 |
GC то сгребает, Dispose как правило используют для закрытия портов, файлов, баз и тд
|
|||
|
||||
archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Dispose никогда не сгребает мусор который сгребает GC. GC никогда сам по себе не сгребает мусор, который сгребает Dispose (для этого исп. финализаторы). Это разный мусор ![]() Добавлено через 1 минуту и 21 секунду в блоке using, Dispose выполняется всегда, при любом выходе из блока. Будь то return, exception, или обрыв потока (генерируется ThreadAbortException) -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет ![]() И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Wanderer2019,
archeg, не путаем финализацию при сборе мусора и Dispose. Слово "мусор" не применимо в одном предложении с "Dispose". GC выполнит финализацию любого объекта (кроме тех для кого вызван SuppressFinalize), т.е. вызовет деструктор при сборке мусора и высвободит память. Метод Dispose обязан вызвать программист, либо явно, либо посредством using; в реализации Dispose сборки мусора не происходит, а явно (ручками) выполняется некий код по высвобождению прочих ресурсов. Например вызов Dispose другого объекта. Или обращение к API-методу, закрывающему файл, сокет, удаляющему ресурс ОС и т.д. При сборке мусора метод Dispose не вызывается автоматически. Можно переопределить деструктор, в котором вызвать Dispose, но об этом у Рихтера лучше почитать - там замечательно расписан паттерн "финалайзер+Dispose". ![]() З.Ы. мои извинения за произнесённые избитые фразы ![]() -------------------- ![]() |
|||
|
||||
altarvic |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 2.3.2007 Репутация: 1 Всего: 1 |
Здесь некоторые путают финализоторы и интерфейс IDisposable (который к финализаторам вообще никакого отношения не имеет. Класс может иметь Dispose, а финализатора нет и наоборот)
Dispose - это вспомогательный метод который служит для детерминированного (т.е. по воле программы) освобождения ресурсов, без ожидания когда это сделает GC. Соответственно чтобы не дублировать код очистки пишут примерно так:
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
altarvic, ну я примерно то же самое написал.
-------------------- ![]() |
|||
|
||||
DrunkProgrammer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 23.10.2007 Где: Омск Репутация: 1 Всего: 1 |
Пардон, что лезу в чужую тему, но у меня проблема с высвобождением ресурсов. Есть компонента, одна из ее функций возвращает объект. Из-за этого объекта зависает процесс в памяти. Если я вместо функции делаю void и вместо строчки return ИмяОбъекта добавляю
Marshal.Release(Marshal.GetIDispatchForObject(ИмяОбъекта)); Marshal.ReleaseComObject(ИмяОбъекта); GC.Collect(); GC.WaitForPendingFinalizers(); то процесс в памяти не зависает. Подскажите, как можно убить этот объект. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [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. |