![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeAndNil
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?
Например, если в будущем понадобится проверить, уничтожен ли экземпляр, на который ссылается данная переменная/поле класса.