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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнится ли Dispose? 
:(
    Опции темы
Idsa
Дата 24.4.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

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



Рассмотрим два куска кода:
Код

public void A()
{
  SomeType instance = new SomeType();

  ... 
  return;

  instance.Dispose();
}

и
Код

public void A()
{
  using(SomeType instance = new SomeType());
  {
    ...
    return;
  }
}

В первом случае Dispose() не выполнится. А вот выполнится ли он во втором куске кода?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
altarvic
Дата 24.4.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



да (даже в случае эксцепшена внутри блока)

Это сообщение отредактировал(а) altarvic - 24.4.2008, 15:10
PM MAIL   Вверх
vponomarov
Дата 24.4.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Idsa, в первом случае Dispose() не выполнится т.к. он стоит после return smile 
хотя может просто опечатка...


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Wanderer2019
Дата 24.4.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



А в случае А при выходе из метода разве Dispose не должен сам выполняться??? или в данном случае зависит от описания класса SomeType?
PM ICQ MSN   Вверх
mullih
Дата 24.4.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Idsa @ 24.4.2008,  14:56)
Код

public void A()
{
  using(SomeType instance = new SomeType());
  {
    ...
    return;
  }
}

А вот выполнится ли он во втором куске кода?

Да если ты SomeType расширишь от интерфеса IDisposable
иначе нет или поидее не должно
Код

    class SomeType : IDisposable
    {
        public void Dispose(){}
    }


кстати и в первом случае тоже самое и Dispose не надо выывать в ручную. Он  вызывется во время сбора мусора сам. Один нюанс ты не знаеь заранее когда это произойдет за исключением если сам не заставишь дотНет собрать его

Это сообщение отредактировал(а) mullih - 24.4.2008, 16:04
PM MAIL WWW Skype   Вверх
Wanderer2019
Дата 24.4.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



А разве GC не должен сгребать весь мусор, на который больще ничего не ссылается? 
В данном случае MyType - это локальная переменная и при выходе из метода необходимость в ней отпадает. 

Это сообщение отредактировал(а) Wanderer2019 - 24.4.2008, 16:08
PM ICQ MSN   Вверх
mullih
Дата 24.4.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



GC то сгребает, Dispose как правило используют для закрытия портов, файлов, баз и тд
PM MAIL WWW Skype   Вверх
archeg
Дата 24.4.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Wanderer2019 @  24.4.2008,  16:07 Найти цитируемый пост)
А разве GC не должен сгребать весь мусор, на который больще ничего не ссылается? 
В данном случае MyType - это локальная переменная и при выходе из метода необходимость в ней отпадает. 

Dispose никогда не сгребает мусор который сгребает GC. GC никогда сам по себе не сгребает мусор, который сгребает Dispose (для этого исп. финализаторы). Это разный мусор smile Каждый сгребает только свой.

Добавлено через 1 минуту и 21 секунду
в блоке using, Dispose выполняется всегда, при любом выходе из блока. Будь то return, exception, или обрыв потока (генерируется ThreadAbortException)


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

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


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Wanderer2019
archeg
не путаем финализацию при сборе мусора и Dispose. Слово "мусор" не применимо в одном предложении с "Dispose". GC выполнит финализацию любого объекта (кроме тех для кого вызван SuppressFinalize), т.е. вызовет деструктор при сборке мусора и высвободит память. Метод Dispose обязан вызвать программист, либо явно, либо посредством using; в реализации Dispose сборки мусора не происходит, а явно (ручками) выполняется некий код по высвобождению прочих ресурсов. Например вызов Dispose другого объекта. Или обращение к API-методу, закрывающему файл, сокет, удаляющему ресурс ОС и т.д. При сборке мусора метод Dispose не вызывается автоматически. Можно переопределить деструктор, в котором вызвать Dispose, но об этом у Рихтера лучше почитать - там замечательно расписан паттерн "финалайзер+Dispose". smile

З.Ы. мои извинения за произнесённые избитые фразы smile 


--------------------
user posted image
PM MAIL WWW   Вверх
altarvic
Дата 25.4.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здесь некоторые путают финализоторы и интерфейс IDisposable (который к финализаторам вообще никакого отношения не имеет. Класс может иметь Dispose, а финализатора нет и наоборот) 
Dispose - это вспомогательный метод который служит для детерминированного (т.е. по воле программы) освобождения ресурсов, без ожидания когда это сделает GC. Соответственно чтобы не дублировать код очистки пишут примерно так:

Код

class Foo: IDisposable
{

private void FreeResources()
{
   // очистка
}

~Foo()
{
   FreeResources();
}

public void Dispose()
{
    FreeResources();
    GC.SuppressFinalize(this); // Запрещаем вызов финализатора
}


}


PM MAIL   Вверх
mr.DUDA
Дата 25.4.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



altarvic, ну я примерно то же самое написал.


--------------------
user posted image
PM MAIL WWW   Вверх
DrunkProgrammer
Дата 25.4.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 23.10.2007
Где: Омск

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



Пардон, что лезу в чужую тему, но у меня проблема с высвобождением ресурсов. Есть компонента, одна из ее функций возвращает объект. Из-за этого объекта зависает процесс в памяти. Если я вместо функции делаю void и вместо строчки return ИмяОбъекта добавляю

 Marshal.Release(Marshal.GetIDispatchForObject(ИмяОбъекта));
 Marshal.ReleaseComObject(ИмяОбъекта);

 GC.Collect();
 GC.WaitForPendingFinalizers();

то процесс в памяти не зависает.
Подскажите, как можно убить этот объект.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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