Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Разнича между Obj=Nothing и Obj.Dispose Добавлено: 23.09.03 21:58  

Автор вопроса:  Tovdi | ICQ: 160516960 

Подскажите в чем разница конструкций:

Obj=Nothing и Obj.Dispose

и в какой  из них освобождается память выделеная под обект

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 Last_Santa



ICQ: 200700724 

Вопросов: 38
Ответов: 329
 Web-сайт: localhost
 Профиль | | #1
Добавлено: 24.09.03 05:22

Если я правильно понял то obj = nothing уничтожает обьект, а obj.dispose  деинициализирует.

Значит разниуа примерно такая же как и при выборе способа удаления программы установленной на компьютере (можно удалить папку с програмой, а лучше воспользоватся деинсталятором)

Ответить

Номер ответа: 2
Автор ответа:
  Creator



Вопросов: 11
Ответов: 61
 Профиль | | #2 Добавлено: 24.09.03 06:44

Риторический вопрос

Почитай про сборку мусора, сейчас у мелкософта новая концепция по этому поводу, много статей на эту тему ....

Ответить

Номер ответа: 3
Автор ответа:
 grayk



Вопросов: 5
Ответов: 100
 Профиль | | #3 Добавлено: 24.09.03 09:42
Dispose освобождает используемые ресурсы. По идее, если класс имеет метод Dispose (т.е. поддерживает интерфейс IDisposable), его обязательно надо использовать перед уничтожением объекта. Я так понял, что если его не использовать, сборщик мусора не сможет выполнить свой долг до конца. А память не освобождается ни в том, ни в другом случае. Тут как раз см. выше. Про новую концепцию мелкософта.

Ответить

Номер ответа: 4
Автор ответа:
 Alex3



ICQ: 9481061 

Вопросов: 18
Ответов: 132
 Профиль | | #4 Добавлено: 24.09.03 10:33

Неверно! Если сделать Nothing, то реально ресурсы освободятся только при сборе мусора. Если же использовать dispose, то объект прибъется, а зетем сразу же вызовется процедура сбора мусора.

Умные люди советуют, что если объект предоставляет метод dispose, то лучше пользоваться именно им. К примеру для объекта Connection dispose, неявно вызывает метод close.

Ответить

Номер ответа: 5
Автор ответа:
 grayk



Вопросов: 5
Ответов: 100
 Профиль | | #5 Добавлено: 24.09.03 10:57

"..., в CLR детерминированное завершение не поддерживается. Нельзя точно предсказать, когда будет вызван завершитель, а в некоторых случаях вызов завершителя вообще не гарантирован."

Дан Эплман, "Переход на VB.Net". с.112

Ответить

Номер ответа: 6
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #6
Добавлено: 24.09.03 10:59
>Я так понял, что если его не использовать, сборщик мусора не сможет выполнить свой долг до конца.

А почему? Ведь GC должен удалять все объекты, на которые нет ссылок.
Раз мы убили ссылку (присваиванием Nothing), то значит объект будет
удалён при следующем запуске GC. Или я не прав?

Ответить

Номер ответа: 7
Автор ответа:
 grayk



Вопросов: 5
Ответов: 100
 Профиль | | #7 Добавлено: 24.09.03 11:24
Прав. Но вот Д.Э. не советует на это особо надеяться. Вообще, тема "глуховатая", проверить все это трудно. Например, как узнать, съел GC ссылку на конкретный объект, или нет, если да, то когда?

Ответить

Номер ответа: 8
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #8
Добавлено: 24.09.03 12:56
> проверить все это трудно
Согласен. Можно попробовать сделать огромный объект, например, класс,
в котором будет создаваться массив с 10000000 Integer'ов. И потом в
диспетчере задач смотреть...

Ответить

Номер ответа: 9
Автор ответа:
 grayk



Вопросов: 5
Ответов: 100
 Профиль | | #9 Добавлено: 24.09.03 13:08
Ага. На что будем смотреть? Где живет этот дворник - в процессе нашего приложения, или где-то в дебрях frameworks? Кажется, надо этот большой объект создавать и убивать неоднократно, чтоб до GC дошло. А может быть, определить в нем (классе) метод Finalize  и всунуть туда какой-нибудь MsgBox? Как думаешь?

Ответить

Номер ответа: 10
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #10
Добавлено: 24.09.03 15:59
> Где живет этот дворник
А кто его знает...

> Кажется, надо этот большой объект создавать и убивать неоднократно
А если запустить сборку мусора вручную?

> определить в нем (классе) метод Finalize
Это зачем?

Ответить

Номер ответа: 11
Автор ответа:
 grayk



Вопросов: 5
Ответов: 100
 Профиль | | #11 Добавлено: 25.09.03 09:50

Провел несколько экспериментов с Dispose, Finalize, GC.Collect и =Nothing. Вот выводы (на оригинальность не претендую):

1. Если объект умирает сам по себе (выход из области видимости) или через =Nothing, по настоящему он уничтожается по завершении приложения, а метод Finalize , если определен, вызывается далеко не для всех объектов (у меня - 2-3 из 1000).

2. Если при тех же условиях вызвать GC.Collect, все мертвые объекты уничтожаются и методы Finalize вызываются во всех объектах, где определены.

3. Если для убиения объекта использовать Dispose, завершитель (Finalize) не вызывается вообще.

------------
А вот дико сложный код тестового класса:

Class DoKill
Inherits System.ComponentModel.Component

Protected Overrides Sub Finalize()

MsgBox("Kill")

End Sub

End Class

Ответить

Номер ответа: 12
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #12
Добавлено: 25.09.03 12:35
Так ты ничего не добьёшься... Насколько я понял, читая Эплмана, для
приложения выделяется кусок памяти и когда весь кусок заполняется,
вызывается GC. То есть нужно в этот класс добавить какой-нть большой
набор левых данных, например, формировать массив a(1000000) as
integer. Тогда возможно будет толк.

Ответить

Номер ответа: 13
Автор ответа:
 grayk



Вопросов: 5
Ответов: 100
 Профиль | | #13 Добавлено: 26.09.03 11:09
Это чтобы заставить уборщика поработать - согласен. Но схема работы, по-видимому, будет та же, что и при ручном вызове. А размер кучи мы все равно ни задать, ни проконтролировать не сможем.

Ответить

Номер ответа: 14
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #14
Добавлено: 27.09.03 06:01
На gotdotnet.ru:

Сборка мусора - это механизм, позволяющий компьютеру определить, когда объект более недоступен. Тогда он автоматически освобождает память, используемую этим объектом (вызывая функцию finalizer, реализованную пользователем). Некоторые сборщики мусора (в т.ч. используемый в .NET), "сжимают" память, уменьшая количество ресурсов, используемых вашей программой.

То есть финализеры должны вызываться при сборке мусора.

grayk: а если попробовать создать/удалить эдак 1000 экземпляров
класса, а потом вручную вызвать GC.Collect?

Дополнительная информация о сборке мусора:
http://msdn.microsoft.com/msdnmag/issues/1100/GCI/GCI.asp
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/GCI2.asp

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам