![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeAndNil
mike_zav © (2007-09-21 17:37:00)В каких случаях применяют FreeAndNil? А в каких просто .Free?
Зачем это нужно? Если можно с примером.
Игорь Шевченко (2007-09-24 13:04:00) [41]Borland же честно подписал "Be careful to only pass TObjects to this routine." :)
Anatoly Podgoretsky (2007-09-24 13:04:00) [42]Откомпилируется, не в таком конец виде, это же шаблон
var
I: Integer;
begin
I := 0;
FreeAndNil(I);
oxffff (2007-09-24 12:59:00) [43]
> FreeAndNil(Integer)
freeandnil(integer);
freeandnil(5);
Такое даже не откомпилируется. ;)
Тогда уж типизировать параметр.
Anatoly Podgoretsky (2007-09-24 12:26:00) [44]> oxffff (24.09.2007 12:12:17) [77]
Tobject.Free;
Tobject := nil;
И не будет таких фокусов, как
FreeAndNil(Integer)
oxffff (2007-09-24 12:12:00) [45]
> Ссылка на объект отличается от самого объекта (тоже ссылки)
> лишь (лишним) разыменованием. By-reference vs by-value -
> тоже.
Методы связаны с блоком памяти в куче, а не с самой ссылкой на этот блок.
Поэтому обнуление ссылки является грамотным вынесением в регулярную процедуру.
А вы как предлагаете?
procedure Tobject.FreeAndNil(var obj:Tobject);?
или class procedure Tobject.FreeAndNil(var obj:Tobject); ?
oxffff (2007-09-24 11:55:00) [46]
> Leonid Troyanovsky © (24.09.07 11:29) [74]
>
> > oxffff © (24.09.07 10:09) [69]
>
> > Согласитесь, что переменная типа Tobject является лишь
>
> > ссылкой на объект. А методы "должны" выполнять операции
>
> > связанные с объектом, а не со ссылкой на него. Поэтому
> технически
> > невозможно "грамотно" обнулить ссылку на объект, по причине
>
> > того, что self передается by value.
>
> Ссылка на объект отличается от самого объекта (тоже ссылки)
> лишь (лишним) разыменованием. By-reference vs by-value -
> тоже.
>
> Ну, а раз оно лишнее, то это и есть изврат :)
>
> Да и, во-ще, тема, IMHO, себя исчерпала,
> а FreeAndNil - MD.
>
> --
> Regards, LVT.
Я думаю мы с вами говорим о разных вещах.
Плохиш (2007-09-24 11:53:00) [47]"Каждому овощу своё время"...
Leonid Troyanovsky (2007-09-24 11:29:00) [48]
> oxffff © (24.09.07 10:09) [69]
> Согласитесь, что переменная типа Tobject является лишь
> ссылкой на объект. А методы "должны" выполнять операции
> связанные с объектом, а не со ссылкой на него. Поэтому технически
> невозможно "грамотно" обнулить ссылку на объект, по причине
> того, что self передается by value.
Ссылка на объект отличается от самого объекта (тоже ссылки)
лишь (лишним) разыменованием. By-reference vs by-value - тоже.
Ну, а раз оно лишнее, то это и есть изврат :)
Да и, во-ще, тема, IMHO, себя исчерпала,
а FreeAndNil - MD.
--
Regards, LVT.
Turbouser (2007-09-24 10:40:00) [49]> [16] Anatoly Podgoretsky © (21.09.07 20:23)
Посмеялся :)) Спасибо за порцию позитива :)))
Kolan (2007-09-24 10:30:00) [50]> Но тем не менее cчитаю ее удобной.
Если бы переменную не заводить, то былобы хорошо совсем
oxffff (2007-09-24 10:20:00) [51]
> Kolan © (24.09.07 10:11) [70]
> > конструкция for in действительна удобна. Хоть я и пишу
> до
> > сих пор на 7 версии.Но считаю ее удобной.
>
> Вот потому и считаешь, а я получал internal error из-за
> неё. Поэтому не использую…
oxffff © (22.09.07 16:50) [67]
Более того я выявил баг в реализации for in и отправил на qc, который получил уже open статус
Но тем не менее cчитаю ее удобной.
Kolan (2007-09-24 10:11:00) [52]> конструкция for in действительна удобна. Хоть я и пишу до
> сих пор на 7 версии.Но считаю ее удобной.
Вот потому и считаешь, а я получал internal error из-за неё. Поэтому не использую
oxffff (2007-09-24 10:09:00) [53]
> Все, что нужно потомку TObject должно быть в _его_ методах,
>
> а не в глобальных регулярных процедурах.
Согласитесь, что переменная типа Tobject является лишь ссылкой на объект. А методы "должны" выполнять операции связанные с объектом, а не со ссылкой на него. Поэтому технически невозможно "грамотно" обнулить ссылку на объект, по причине того, что self передается by value.
А передовать ссылку на объект by ref в метод объекта не "грамотно".
Конечно можно создать невиртуальный классовый метод в Tobject, который принимает ссылку на объект и делает то, что делает FreeAndNil.
Но фактически классовый метод является регулярной функцией с ограниченным scope и дополнительным параметром на VMT, что избыточно по причине того, что VMT является ненужным параметром, и его мы может при желании изъвлечь из объекта.
Таким образом из-за ref семантики объектов в delphi операции над ссылкой и вынесли за пределы object scope. Поэтому это не извращение.
Вопрос, а как вы бы постулили в C++, где object is value type semantic?
Leonid Troyanovsky (2007-09-22 16:55:00) [54]
> oxffff © (22.09.07 16:29) [61]
> Почему бы не сделать свой выбор в пользу неявного приведения
> для ссылочных типов с простой семантикой копирования.
> А именно для типов Tobject, нетипизированного указателя
> и указателей на типы с простой семантикой копирования? А
> как же для ссылок на эти типы.
А зачем?
Передача var TObject - извращение, FreeAndNil тому иллюстрация.
Все, что нужно потомку TObject должно быть в _его_ методах,
а не в глобальных регулярных процедурах.
--
Regards, LVT.
oxffff (2007-09-22 16:50:00) [55]
> Но считаю ее удобной.
Я о новых конструкциях.
Сейчас я поехал в баню париться. :)
Вечером приеду и с вашего позволения я был бы рад продолжить дисскусию.
Спасибо всем за диалог.
oxffff (2007-09-22 16:45:00) [56]
> Anatoly Podgoretsky © (22.09.07 16:35) [63]
> А насчет хотелок, многие хотели бы превратить Паскаль в
> Си или Бейсик и обидно, что Борланд иногда идет на поводу.
>
Я все таки думую нужно быть не гордым, а расчетливым и "видеть" как одни конструкции удобнее, или быстрее других. Согласитесь, что конструкция for in действительна удобна. Хоть я и пишу до сих пор на 7 версии.Но считаю ее удобной. Также как и внесение статических методов в record.
Также как и nested types, class var. И даже те же Class helpers и record helper.
Не смотря на что приходится писать и на других языках включая С++,C#, ASM и ряд других.
Все равно Delphi мне ближе.
Anatoly Podgoretsky (2007-09-22 16:41:00) [57]> oxffff (22.09.2007 16:39:04) [64]
К Вирту, он папа и к извращенцам из Борланда.
oxffff (2007-09-22 16:39:00) [58]
> Anatoly Podgoretsky © (22.09.07 16:34) [62]
> То что это документировано, или передаешь var Name без типа
> или var Name: тип, тогда должно быть соответствие формальных
> и фактических параметров.
Да об этом и речи нет.
Я о расширении языка.
И чтобы не было каламбура по типу oxffff © (22.09.07 14:54) [43].
Только скажите как в языке со строгой типизацией присутствуют конструкции untyped var, out, const педачи параметров?
Anatoly Podgoretsky (2007-09-22 16:35:00) [59]А насчет хотелок, многие хотели бы превратить Паскаль в Си или Бейсик и обидно, что Борланд иногда идет на поводу.
Anatoly Podgoretsky (2007-09-22 16:34:00) [60]То что это документировано, или передаешь var Name без типа или var Name: тип, тогда должно быть соответствие формальных и фактических параметров.