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