![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение ресурса в finally
Arinyshka © (2008-04-23 12:17:00)
Страницы: < 1 2 ... 24 25 26 27 28 29 30 31 32 33 >
Не подскажете еще один момент:
Есть процедура, выглядит примерно так
procedure TSetPayFrm.BtnAddImageClick(Sender: TObject);
var TempBitmap:TBitmap;
begin
if not(opendialog1.Execute) then exit;
try
TempBitmap := TBitmap.Create;
TempBitmap.LoadFromFile(OpenDialog1.FileName);
finally
TempBitmap.Free;
end;
end;
На освобождение TempBitmap.Free; выдает варнинг
[Warning] uSetPaymentMain.pas(313): Variable 'TempBitmap' might not have been initialized
Не смертельно, но непонятно... почему варнинг? При изменениии условия и включении всей конструкции в один блок begin..end ситуация не менялась.
Palladin (2008-04-24 15:12:00) [541]
> ZENsan © (24.04.08 15:10) [110]
вот вот... кто то не знает, это точно... не будем показывать пальцами...
Palladin (2008-04-24 15:11:00) [542]
> ZENsan © (24.04.08 15:09) [109]
о как... а я оказывается ерундой страдаю... пользуюсь тем чего нет... интересно...
ZENsan (2008-04-24 15:10:00) [543]На счёт 2005.. ошибочка, помоему в ней были уже - точно не помню. Но в 7 100% никогда не было! Может просто кто-то не знает что это такое...
ZENsan (2008-04-24 15:09:00) [544]
> Восхищенный (24.04.08 12:40) [77]
> > ZENsan © (24.04.08 12:26) [72] > Constructor i Destructor
> - единственные класс методы до реализации класс> методов
> в делфи начиная по моему с 2005-ого..1. Конструктор и деструктор
> - вообще не классовые методы.2. Классовые методы реализованы
> во всех версиях Delphi, начиная аж с 1.3. В [65] Плохиш
> дал очень хороший совет. Конечно, можно и дальше переливать
> здесь из пустого в порожнее, но лучше все же последовать
> этому совету.
Посмотри http://delphi.about.com/od/objectpascalide/a/classmethods.htm
В Делфи до 2005 версии не было класс методов кроме конструкторов и деструкторов. И в описании Делфи 2005 описивается это как новоая возможность: http://dn.codegear.com/article/34324
Где пишется, что до 7 версии включительно класс методов НЕБЫЛО!
ANB (2008-04-24 15:08:00) [545]
> Ega23 © (24.04.08 14:52) [104]
Я озвучил простенькую задачу, приближенную к реальной.
Как разделить эту процедуру на три метода ?
Ega23 (2008-04-24 15:04:00) [546]
> Stupid
блин. Полминуты наверное соображал, что за StupID такой... :)
Игорь Шевченко (2008-04-24 14:56:00) [547]Ega23 © (24.04.08 14:54) [105]
> Универсального вообще ничего нет.
Есть. Принцип Keep It Simple, Stupid
Ega23 (2008-04-24 14:54:00) [548]
> Нету универсального решения
Универсального вообще ничего нет. Это утопия... :)
Ega23 (2008-04-24 14:52:00) [549]
> И как вы это себе представляете с вашим подходом к блокам
> трай-файнели ?
А что с ними не так?
try-finally я использую только для объектов, время жизни которых в пределах данного метода, либо для парных операций, типа DisableControls\EnableControls
А объекты - это либо временный DataSet, либо TStream, либо TStringList, либо TBitmap или TJPEGImage. Ну TIniFile ещё возможно.
Это 95% классов, которые я таким образом использую.
Игорь Шевченко (2008-04-24 14:43:00) [550]
> Создание и инициализация объектов - в один метод, цикл -
> во второй, финализация и удаление объектов - в третий..
> .
> Метод больший, чем на один экран - сразу настораживает.
Нету универсального решения
ANB (2008-04-24 14:43:00) [551]
> Ega23 © (24.04.08 14:39) [100]
>
> > Зачем ? В итерации цикла создавать и разрушать объекты
> -
> > это извращение.
>
>
> Создание и инициализация объектов - в один метод, цикл -
> во второй, финализация и удаление объектов - в третий..
> .
> Метод больший, чем на один экран - сразу настораживает.
И как вы это себе представляете с вашим подходом к блокам трай-файнели ?
Игорь Шевченко (2008-04-24 14:41:00) [552]ANB (24.04.08 14:33) [98]
> В итерации цикла создавать и разрушать объекты - это извращение.
Объекты создаются, используются и удаляются, исключительно по мере надобности в этих объектах.
Если надобностью диктуется создать их внутри итерации цикла и удалить в конце итерации цикла, то их надо создавать внутри итерации цикла и не иначе.
Anatoly Podgoretsky (2008-04-24 14:39:00) [553]> Игорь Шевченко (24.04.2008 14:28:34) [94]
И вычитать из их кармана, за расточительство.
Ega23 (2008-04-24 14:39:00) [554]
> Зачем ? В итерации цикла создавать и разрушать объекты -
> это извращение.
Создание и инициализация объектов - в один метод, цикл - во второй, финализация и удаление объектов - в третий...
Метод больший, чем на один экран - сразу настораживает.
ANB (2008-04-24 14:33:00) [555]
> А это что, необходимо делать в одном месте? Это нельзя разнести
> на несколько методов?
Зачем ? В итерации цикла создавать и разрушать объекты - это извращение.
Игорь Шевченко (2008-04-24 14:32:00) [556]Kolan © (24.04.08 12:46) [79]
> Имхо, слово constructor подразумевает class function, так
> что, имхо, классовый.
как же он может быть классовый, когда конструктор работает с данными конкретного экземпляра ?
Воистину www.delphilamer.ru
ANB (2008-04-24 14:31:00) [557]
> Palladin © (24.04.08 14:26) [93]
>
> > Объектов 5-6 наберется.
>
> каких например?
3 файлстрима, пара объектов для селектов к БД, объект для инсерта в БД.
Ega23 (2008-04-24 14:29:00) [558]
> Естественным подходом в таком случае будет создать все объекты
> заранее и только по окончании процедуры удалить.
>
А это что, необходимо делать в одном месте? Это нельзя разнести на несколько методов? И насколько велика вероятность возникновения исключения в конструкторе любого из них?
Я за 9 лет один единственный раз с raise конструктор писал (и то, вроде, можно было без этих извратов сделать).
Игорь Шевченко (2008-04-24 14:28:00) [559]ANB (24.04.08 10:31) [36]
> В случае с одним объектом, конечно, доп.строки являются
> лишними.
> Это я по привычке пишу, чтобы потом не переделывать, если
> в процедуре понядобятся еще объекты.
Тех, кто пишет что-либо, на случай, если потребуется - давить без жалости.
Anatoly Podgoretsky (2008-04-24 14:26:00) [560]Что только не придумают, что бы оправдать лень или не знание,
правильный код только такой
Create;
try
...
finally
Free;
end;
Никаких множественных obj := nil, много, ну и что, а если посмотреть с другой стороны, например отладка и поиск ошибок, код
Create;
try
Create;
try
Create;
try
Create;
try
...
finally
Free;
end;
finally
Free;
end;
finally
Free;
end;
end;
Позволяет легко видет структуру, легко искать ошибки и это без лишних действий
Free;
Free;
Free;
..
Free;
А кто то за такты боролся, вот они где улетели, куча не нужных Free, как было сказано, если произойдет ошибка на втором Create, то Free будет вызван только один раз. При том приведена сильно упрощеная схема, а в реальности между двумя вызовами Create может быть еще много команд.
Есть конечно редкие случае, а это серверы 24x7 где все надо обертывать множеством try, включая и Create, но таких случаев мало, в основном или лень, или ламеризм, при том с "научным" обоснованием.