![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтобы локальные переменные в функциях
Бездомный © (2011-10-06 13:35:00)обнулялись автоматически перед выполнением, есть такая директивка?
Если нет, можно ли как-нибудь написать такую процедурку LocalNullify:
function foo (param1, param2, ... paramN: AnyType1, ...): AnyType;
var
... тут неопределенное количество переменных, неопределенного размера ...
begin
LocalNullify;
//-- все локальные переменные обнулились, можно работать.
end;
Компилятор же некоторые типы (интерфейсы, динамические массивы) все-таки инициализирует.
P.S. Delphi 7, Delphi XE,XE2
Dennis I. Komarov (2011-10-06 15:43:00) [41]
> Ega23 © (06.10.11 14:28) [16]
> Есть мнение
+1
Ega23 (2011-10-06 14:28:00) [42]
> Да это понятно, но даже с 4 объектами уже будет громоздко.
Есть мнение, что если приходится регулярнопо 4 и более локальных объектов внутри функции-метода создавать то имеет смысл пересмотреть архитектуру.
Ega23 (2011-10-06 14:26:00) [43]
> В новых версиях можно както-то так сделать
Можно. А нафига? С времени создания [0] прошёл почти час, у меня эти нестчастные
Errors := TStringList.Create;
try
Output := TStringList.Create;
try
ProgressForm := TProgressForm.Create;
try
Query := TAdoQuery.Create;
try
// Do work here
finally
Query.Free;
end;
finally
ProgressForm.Free;
end;
finally
Output.Free;
end;
finally
Errors.Free;
end;
даже ребёнок бы набрал который текст одной рукой и одним пальцем набирает.
Бездомный (2011-10-06 14:22:00) [44]
> только это всё равно говнокод, в [3] Денис уже написал,
> как надо
Да это понятно, но даже с 4 объектами уже будет громоздко.
Бездомный (2011-10-06 14:20:00) [45]В новых версиях можно както-то так сделать, все меньше писать:
with Objects(procedure
Add(@Errors, TStringList.Create);
Add(@Output, TStringList.Create);
...
end) do
try
...
finally
FreeAll;
end;
Ega23 (2011-10-06 14:17:00) [46]
> Бездомный (06.10.11 14:10) [9]
try
Errors := TStringList.Create;
Output := TStringList.Create;
ProgressForm := TProgressForm.Create; // <- тут исключение
Query := TAdoQuery.Create;
finally
Errors.Free;
Output.Free;
ProgressForm.Free;
Query.Free; // <- Query остался неизвестно чем из стека.
end;
А нехер конструктор внутри try вызывать.
Errors := TStringList.Create;
Output := TStringList.Create;
ProgressForm := TProgressForm.Create; // <- тут исключение
Query := TAdoQuery.Create;
try
.....
finally
// В обратном порядке
Query.Free;
ProgressForm.Free;
Output.Free;
Errors.Free;
end;
только это всё равно говнокод, в [3] Денис уже написал, как надо
RWolf (2011-10-06 14:17:00) [47]да, надо обнулять.
Бездомный (2011-10-06 14:11:00) [48]
> RWolf © (06.10.11 14:10) [8]
Речь идет о создании нескольких объектов сразу. Если исключение произойдет в TProgressForm.Create, то Errors и Output автоматически не освободятся.
Бездомный (2011-10-06 14:10:00) [49]
{Errors := nil;
Output:= nil;
ProgressForm := nil;
Query:=nil; -- убрали обнуление}
try
Errors := TStringList.Create;
Output := TStringList.Create;
ProgressForm := TProgressForm.Create; // <- тут исключение
Query := TAdoQuery.Create;
finally
Errors.Free;
Output.Free;
ProgressForm.Free;
Query.Free; // <- Query остался неизвестно чем из стека.
end;
RWolf (2011-10-06 14:10:00) [50]Если в конструкторе присходит исключение, автоматически вызывается деструктор.
Зачем все эти try/finally?
Бездомный (2011-10-06 14:10:00) [51]
> Ega23 © (06.10.11 14:04) [6]
{Errors := nil;
Output:= nil;
ProgressForm := nil;
Query:=nil; -- убрали обнуление}
try
Errors := TStringList.Create;
Output := TStringList.Create;
ProgressForm := TProgressForm.Create; // <- тут исключение
Query := TAdoQuery.Create;
finally
Errors.Free;
Output.Free;
ProgressForm.Free;
Query.Free; // <- Query остался неизвестно чем из стека.
end;
Ega23 (2011-10-06 14:04:00) [52]Чтобы не писать:
Errors := nil;
Output:= nil;
ProgressForm := nil;
Query:=nil;
А их и не надо писать.
Бездомный (2011-10-06 13:55:00) [53]
> Dennis I. Komarov © (06.10.11 13:54) [3]
Это еще больший ппц, на самом деле =(
Dennis I. Komarov (2011-10-06 13:55:00) [54]только finally наоборот :-[
Dennis I. Komarov (2011-10-06 13:54:00) [55]
Errors := TStringList.Create; try
Output := TStringList.Create; try
ProgressForm := TProgressForm.Create; try
Query := TAdoQuery.Create; try
...
finally
Errors.Free;
end;
finally
Output.Free;
end;
finally
ProgressForm.Free;
end;
finally
Query.Free;
end;
Бездомный (2011-10-06 13:45:00) [56]
> Ega23 © (06.10.11 13:40) [1]
Чтобы не писать:
Errors := nil;
Output:= nil;
ProgressForm := nil;
Query:=nil;
try
Errors := TStringList.Create;
Output := TStringList.Create;
ProgressForm := TProgressForm.Create;
Query := TAdoQuery.Create;
finally
Errors.Free;
Output.Free;
ProgressForm.Free;
Query.Free;
end;
Ega23 (2011-10-06 13:40:00) [57]
> есть такая директивка?
Нет.
> можно ли как-нибудь написать такую процедурку LocalNullify:
А нафига?