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?
Зачем это нужно? Если можно с примером.


oxffff   (2007-09-22 14:44:00) [81]


> Anatoly Podgoretsky ©   (22.09.07 14:36) [40]
> > oxffff  (22.09.2007 14:32:39)  [39]
>
> Может из-за var
> В этом случае да, параметры не идентичны.


Так является ли это упущением с вашей точки зрения?

Ведь именно по этой причине FreeAndNil имеет вид

procedure FreeAndNil(var Obj);

а не

procedure FreeAndNil(var Obj:Tobject);

Почему если типы совместимы, ссылки на них не совместимы?

Повторю еще раз

Так является ли это упущением с вашей точки зрения?


Anatoly Podgoretsky   (2007-09-22 14:36:00) [82]

> oxffff  (22.09.2007 14:32:39)  [39]

Может из-за var
В этом случае да, параметры не идентичны.


oxffff   (2007-09-22 14:32:00) [83]


> Anatoly Podgoretsky ©   (22.09.07 14:27) [38]
> > oxffff  (22.09.2007 14:21:37)  [37]
>
> В данном случае ни к каким, поскольку tControl наследник
> от Tobject и обладает всеми его методами и полями. Вот наоборот
> нельзя.


И я о том же. Только почему компилятор не пропускает это?

В чем причина этого ограничения.

Пойдем дальше. Почему ругается?

procedure abc(var a:Tobject);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:pointer;
begin
abc(a);
end;

Tobject и pointer "совместимы". А передача как var параметра накладывает самые строгие ограничения.

Не считаете ли вы это упущением?


Anatoly Podgoretsky   (2007-09-22 14:27:00) [84]

> oxffff  (22.09.2007 14:21:37)  [37]

В данном случае ни к каким, поскольку tControl наследник от Tobject и обладает всеми его методами и полями. Вот наоборот нельзя.


oxffff   (2007-09-22 14:21:00) [85]

Почему выходит
Types of actual and formal var parameters must be identical?

Для

procedure abc(var a:Tobject);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:tControl;
begin
abc(a);
end;

К каким проблемам это может привести?


oxffff   (2007-09-22 14:16:00) [86]


> Anatoly Podgoretsky ©   (22.09.07 13:58) [35]
> > oxffff  (22.09.2007 13:51:34)  [34]
>
> > А мне собственно не понятно почему они поставили untyped
> параметр?
>
> Посмотри исходные коды, может станет понятно.
> Но с тезисом, что это бардак и некомпетентность ты в принципе
> согласен?


С тезисом я согласен.
Действительно FreeAndNil(var Obj: TObject) более строгое определение.

Понял ваш намек. Чтобы не мучиться с приведение var параметров.

Тогда. Вопрос.

Почему бы не добавить поддержку неявного приведения var параметров.

Если Tobject и pointer "совместимы"
Если потомок и родитель "совместимы"

Почему тогда  ссылка(var параметр) на эти типы не совместимы.

Например мы же можем спокойно присваивать потомков Tobject к pointer и наоборот. Почему не сделать такое неявное приведение для var параметров.
Сейчас в голову не приходит каких либо проблем с этим. IMHO.


Anatoly Podgoretsky   (2007-09-22 13:58:00) [87]

> oxffff  (22.09.2007 13:51:34)  [34]

> А мне собственно не понятно почему они поставили untyped параметр?

Посмотри исходные коды, может станет понятно.
Но с тезисом, что это бардак и некомпетентность ты в принципе согласен?


oxffff   (2007-09-22 13:51:00) [88]


> Anatoly Podgoretsky ©   (22.09.07 13:44) [32]
> > oxffff  (22.09.2007 13:34:31)  [31]
>
> Реализаций по сути две
> FreeAndNil и NilAndFree
>
> Реализация функции мне не нравится по следующей причине
>
> procedure FreeAndNil(var Obj);
>
> Видим уход от типизации и соответсвенно невозможность проверить
> еще на этапе компиляции.
> Почему они так поступили конечно понятно, но я бы их расстрелял.
>
> Вот если бы они реализовали так
>
> procedure FreeAndNil(var Obj: TObject);
>
> То таких бы претензий у меня не было. Компилятор бы просто
> не пропустил многие ошибки.


А мне собственно не понятно почему они поставили untyped параметр?


Anatoly Podgoretsky   (2007-09-22 13:46:00) [89]

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


Anatoly Podgoretsky   (2007-09-22 13:44:00) [90]

> oxffff  (22.09.2007 13:34:31)  [31]

Реализаций по сути две
FreeAndNil и NilAndFree

Реализация функции мне не нравится по следующей причине

procedure FreeAndNil(var Obj);

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

procedure FreeAndNil(var Obj: TObject);

То таких бы претензий у меня не было. Компилятор бы просто не пропустил многие ошибки.


oxffff   (2007-09-22 13:34:00) [91]


> Anatoly Podgoretsky ©   (22.09.07 13:31) [30]
> > oxffff  (22.09.2007 13:22:29)  [29]
>
> Спор ведется о буквах, мол неправильное название и спор
> ведется уже не один год.


Дык и текущая реализация не идеальна.

Ловим AV.
:)

procedure TForm1.Button1Click(Sender: TObject);
var a:^TObject;
begin
a:=nil;
Freeandnil(a^);
end;


Anatoly Podgoretsky   (2007-09-22 13:31:00) [92]

> oxffff  (22.09.2007 13:22:29)  [29]

Спор ведется о буквах, мол неправильное название и спор ведется уже не один год.


oxffff   (2007-09-22 13:22:00) [93]


> Anatoly Podgoretsky ©   (22.09.07 11:56) [28]
> > Инс  (21.09.2007 23:10:27)  [27]
>
> Полемика NilAndFree или FreeAndNil ведется с момента появления
> функции.
> Так же как и необходимость в данной функции.
> Все остаются при своих.


А спор о чем?


Anatoly Podgoretsky   (2007-09-22 11:56:00) [94]

> Инс  (21.09.2007 23:10:27)  [27]

Полемика NilAndFree или FreeAndNil ведется с момента появления функции.
Так же как и необходимость в данной функции.
Все остаются при своих.


Инс   (2007-09-21 23:10:00) [95]

И снова возвращаясь к первоначальной постановке вопроса... Мне тут статейку одну по этой теме подсказали (спасибо DRON ;-) ), немного трудновато написано, но все равно рекомендую:
http://blogs.codegear.com/abauer/2006/11/01/28852


Anatoly Podgoretsky   (2007-09-21 21:12:00) [96]

> Инс  (21.09.2007 21:09:25)  [25]

Вывод о категоричности неверный, это только кажется (стиль у меня такой). Я готов рассматривать и альтернативные варианты, вплоть до правомерности и ламерского кода.


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


> Не будем рассматривать особые случае, я оперирую более общей
> сущностью.

Я спорю только с категоричностью утверждения. Говорю, что в таком виде вывод не верный, есть оговорки. Вот и пытаюсь их обговорить...


Anatoly Podgoretsky   (2007-09-21 21:03:00) [98]

> Инс  (21.09.2007 20:52:23)  [23]

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


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

Ясно, пациент безнадежен :) Ладно, дальше спорить не буду. Вот это разве что прокомментирую.

> Функция была изобретена для ленивых и она не обязательна к
> использованию, более того она провоцирует на не совсем безопасный код

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


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

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

Я думаю был раскрыт.
Функция была изобретена для ленивых и она не обязательна к использованию, более того она провоцирует на не совсем безопасный код.

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


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

Наверх

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