Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

FreeAndNil


Страницы:   1 2 3 4 5 6 7

mike_zav ©   (2007-09-21 17:37:00) 

В каких случаях применяют FreeAndNil? А в каких просто .Free?
Зачем это нужно? Если можно с примером.


Инс   (2007-09-21 20:41:00) [101]


> Очепятка в третьем примере

Я догадался, все в порядке :)

Как считаете, в данной дискусии был раскрыт вопрос автора или нет? Истина найдена? Итоги подводить можно?


Anatoly Podgoretsky   (2007-09-21 20:36:00) [102]

Очепятка в третьем примере

published
  X: type read GetX write SetX;


Anatoly Podgoretsky   (2007-09-21 20:35:00) [103]

У нас есть разделение, есть писатели компонент, а есть их пользователи и это даже может быть один и тот-же человек.
Утверждение не категоричное, а относится к культуре проектирования.
Надо предусмотреть меры по защите члена от непреднамеренного изменения за пределами класса, изоляция прямого доступа. Вот это и есть контролирование поведения на "системном" уровне.
Разница между


> public
>     X: type;


и

private
   FX: type;
published
   X: type read FX write FX;


большая и тем более для

private
   FX: type;
   function GetX: type;
   procedure SetX(X: type);
published
   X: type read FX write FX;


Практически весь VCL пропитан этим.
И в третьем случае полный контроль над членом класса, без утечек и непридвиденного измения.

X := TBitmap.Create;
X := TBitmap.Create;
X := TBitmap.Create;
X := TBitmap.Create;
X := nil;


Никаких утечек, несмотря что нет разрушения старого значения.


Инс   (2007-09-21 20:25:00) [104]

Комментирую [10]:


> только на пользовательском уровне

Ну, мы же вроде не только пользователи, но и программисты, иногда классы приходится писать самому. А следовательно может возникнуть подобная ситуация. И тогда можно действовать подобным образом. У меня даже когда-то было что-то похожее, но вот пока найти не могу, привел бы пример. А значит слишком категоричное утверждение о забывчивости и неумении становится не совсем верным. Случаи ведь разные бывают.


Anatoly Podgoretsky   (2007-09-21 20:24:00) [105]

> Инс  (21.09.2007 20:21:14)  [14]

Не если не понял не стесняйся уточнить.


Anatoly Podgoretsky   (2007-09-21 20:23:00) [106]

Функция FreeAndNil сравни функии IncDay


Инс   (2007-09-21 20:21:00) [107]

А, все, кажется понял...


Anatoly Podgoretsky   (2007-09-21 20:21:00) [108]

> Инс  (21.09.2007 20:18:13)  [13]

> FCanvas это контролируемая вещь, которую не обойдешь, а
> обнулить я предпочту явно.

> Несколько раз перечитал это предложение, не могу понять смысл...

Все равно не понятно, что именно непонятно.
Что такое контролируемое или почему явно?


Инс   (2007-09-21 20:18:00) [109]


> FCanvas это контролируемая вещь, которую не обойдешь, а
> обнулить я предпочту явно.

Несколько раз перечитал это предложение, не могу понять смысл...


> Может термин повторное использование переменных?

Нет, с этим как раз все понятно.


Anatoly Podgoretsky   (2007-09-21 20:15:00) [110]

> Инс  (21.09.2007 20:14:11)  [11]

Что именно, я же много о чем говорил.
Может термин повторное использование переменных?


Инс   (2007-09-21 20:14:00) [111]


> [10] Anatoly Podgoretsky ©   (21.09.07 20:11)

Прошу прощения, не совсем понял вашу последнюю мысль...


Anatoly Podgoretsky   (2007-09-21 20:11:00) [112]

> Инс  (21.09.2007 20:05:09)  [9]

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


Инс   (2007-09-21 20:05:00) [113]


> Никогда не применял, за ненадобностью подобной функций,
> которая была сделана Борландом для забывчивых и неумеющих.
> Наличие подобной функции как правило говорит о недостатках
> в программе.

Ну, значит Borland сами забывчивы и неумеющие :) Например, в модуле Graphics - используется повсеместно. Например класс TBitmap метод GetCanvas вначале проверяет на равенство поля FCanvas nil, и только потом в случае успешной проверки создает экземпляр TCanvas. А когда Canvas становится невалидным (например, после вызова Dormant) - уничтожает ее и обнуляет ссылку. Теперь, если вдруг кто-либо обратится к свойству Canvas, снова вызывается GetCanvas, проверяется на nil и т.д.
Т.е. благодаря обнулению ссылок можно создавать вложенные объекты только по требованию.


Сергей М.   (2007-09-21 19:39:00) [114]


> mike_zav   (21.09.07 19:34) [7]



> это должно спасти .. ?


А куда ему деться с подводной лодки ?)

"Согласие есть продукт при полном непротивлении сторон" (С)

FreeAndNil "нилит" переменную, а Assigned, видя этот "нил", согласен и имеет все основания выдать False.


mike_zav   (2007-09-21 19:34:00) [115]

Бррр.. так я и не понял одного, это должно спасти от ложного срабатывания Assign, при уже уничтоженном объекте?


Anatoly Podgoretsky   (2007-09-21 18:56:00) [116]

> Инс  (21.09.2007 17:42:02)  [2]

Переменная это недостаток, а поля можно и нужно делать контролируемыми.


Anatoly Podgoretsky   (2007-09-21 18:55:00) [117]

> mike_zav  (21.09.2007 17:37:00)  [0]

Никогда не применял, за ненадобностью подобной функций, которая была сделана Борландом для забывчивых и неумеющих. Наличие подобной функции как правило говорит о недостатках в программе.


Leonid Troyanovsky   (2007-09-21 17:48:00) [118]


> mike_zav   (21.09.07 17:37)  

> Зачем это нужно? Если можно с примером.

Да, собс-но, не нужно. Ну, может, писать короче.
Но, от неприятностей оно не спасет.

--
Regards, LVT.


stanislav   (2007-09-21 17:45:00) [119]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1190379982&n=18


Инс   (2007-09-21 17:42:00) [120]


> В каких случаях применяют FreeAndNil?

Например, если в будущем понадобится проверить, уничтожен ли экземпляр, на который ссылается данная переменная/поле класса.


Страницы:   1 2 3 4 5 6 7

Наверх

Титульная страница Поиск, карта сайта Написать письмо