![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наболевший вопрос. Корректно ли такое освобождение памяти [D5, Win2k]
Валера_ © (2002-03-04 11:19:00)прицепляю...
for i:=1 to RowCount-1 do
for j:=1 to colCount-1 do
begin
SG.Objects[j,i]:=TSomeClass.Create;
TSomeClass(SG.Objects[j,i]).{SomeFields}:={SomeValues};
TSomeClass(SG.Objects[j,i]).{SomeFields}:={SomeValues};
TSomeClass(SG.Objects[j,i]).{SomeFields}:={SomeValues};
end;
отцепляю...
for i:=1 to RowCount-1 do
for j:=1 to colCount-1 do
begin
if SG.Objects[j,i]<>nil then
TSomeClass(SG.Objects[j,i]).Free;
SG.Objects[j,i]:=nil;
end;
Anatoly Podgoretsky (2002-03-11 21:40:00) [1]Валера_ (04.03.02 11:19)
Проверку на nil перед Free делать не стоит, двойная работа, она делается внутри Free
Alx2 (2002-03-11 12:47:00) [2]>kull (11.03.02 12:35)
>Следованть не обязательно, но стоит задуматься...
> http://download.olis.ru/pages.php?direction=softlab
Прочел. Но, думаю, здесь скорее всего вопрос стиля программирования. И именно при использования with obj1, obj2, .. do. С этим случаем почти согласен. Есть подводные камни. Но опять-таки, нужно знать, что делаешь....
kull (2002-03-11 12:35:00) [3]
> Alx2
С последним согласен.
А вот ссылочка на крохотный стандартик.
Следованть не обязательно, но стоит задуматься...
http://download.olis.ru/pages.php?direction=softlab
Alx2 (2002-03-11 12:29:00) [4]>А потом разбирайся с каким объектом работаешь внутри
>"with", если поля названы одинаково?
Это - искусственный геморрой. Используй разные with.
Вообще, with себя оправдывает (в плане производительности и незамусоренности кода), когда необходимо обработать множество полей. Бывает, когда в некоторой формуле нужно использовать множество полей объекта и писанина типа Point((Bitmap.Canvas.ClipRect.Right+Bitmap.Canvas.ClipRect.Left) div 2,(Bitmap.Canvas.ClipRect.Top+Bitmap.Canvas.ClipRect.Bottom) div 2), только запутывает излишней подробностью.
PS
Это азбука без темы для разговора.
Shaman_Naydak (2002-03-11 12:13:00) [5]>kull
Присоединяюсь к Alx2
kull (2002-03-11 12:13:00) [6]
> with obj1, ..., objn do statement
Ну и как вам эта кострукция?
А потом разбирайся с каким объектом работаешь внутри "with", если поля названы одинаково?
(хотя понятно (из того же хелпа) что обращение идет с права на лево).
Код надо писать понятным для человека и легко читаемым.
Например такой изврат:
type
TSubkaka = record
F: string;
end;
TKaka = record
F: TSubkaka;
end;
..................
var
kaka1,kaka2,kaka3: TKaka;
subkaka: TSubkaka;
.............
with subkaka,kaka1,kaka2,kaka3 do
begin
F.F := "kaka";
F := subkaka;
// F := "kaka";
end;
....................
а теперь раскомментируем последнюю строку в теле with и
попереставляем subkaka после with...
Вредно заниматься преждевременной оптимизацией.
И к тому же выигрывать надо за счет алгоритма...
Alx2 (2002-03-11 12:00:00) [7]>kull (11.03.02 11:23)
Ссылочку на это гонево можно?
DieHard (2002-03-11 11:47:00) [8]Из хелпа:
A with statement is a shorthand for referencing the fields of a record or the fields, properties, and methods of an object. The syntax of a with statement is
with obj do statement
or
with obj1, ..., objn do statement
where obj is a variable reference denoting an object or record, and statement is any simple or structured statement.
If the interpretation of obj involves indexing arrays or dereferencing pointers, these actions are performed once, before statement is executed. This makes with statements efficientas well as concise. It also means that assignments to a variable within statement
cannot affect the interpretation of obj during the current execution of the with statement.
kull (2002-03-11 11:23:00) [9]Вычислений может и меньше (хотя это точно неизвестно даже тем, кто писал компилятор DCC32.exe), а вот ,простите, геморою больше.
И вообше использовать "with" как то не красиво, неаккуратно, и даже не рекомедуется (причем самими разработчиками Delphi), это из той же серии, что и "goto"...
Lord Warlock (2002-03-11 09:31:00) [10]Если D5, то можно использоавать FreeAndNil(Class)
Alx2 (2002-03-11 07:53:00) [11]>Набережных С. (04.03.02 16:21)
>Никакой разницы
Неправда! разница есть. И она состоит в количестве вызовов TStringGrid.GetObjects (и не только, но этого достаточно)
Набережных С. (2002-03-04 16:21:00) [12]
> Валера_ (04.03.02 11:19)
Вполне.
> Alx2 © (04.03.02 11:24)
> (вычислений меньше)
Никакой разницы.
Alx2 (2002-03-04 11:24:00) [13]Кажется, да. По крайней мере, если они идут друг за другом (как в примере) :)
Но эту вещь, IMHO, аккуратнее сделать так: (вычислений меньше)
for i:=1 to RowCount-1 do
for j:=1 to colCount-1 do
begin
SG.Objects[j,i]:=TSomeClass.Create;
With TSomeClass(SG.Objects[j,i]) do
begin
{SomeFields}:={SomeValues};
{SomeFields}:={SomeValues};
{SomeFields}:={SomeValues};
end;
end;