Насколько я понимаю, то, что у тебя есть, должно быть совершенно правильно.Немного неловко, но верно.
Но лучшим способом может быть объявление переменной в модуле B и ее инициализация / финализация в B.Поскольку инициализация происходит до вызова любого другого кода, он будет инициализирован до того, как он будет сделан доступным для модуля A, если он объявлен в предложении использования модуля A.
Еще один шаг, который вы могли бы рассмотреть, - этопереместив единичную переменную B на один шаг вперед и сделав ее вызовом функции для загрузки по требованию, но это также может зависеть от вашего использования.
например
unit unitB;
interface
type
TFoo = class
// code...
end;
// code....
function UnitVarB:TFoo;
implementation
var
gUnitVarB : TFoo;
function UnitVarB:TFoo
begin
if not assigned(gUnitVarB) then
gUnitVarB := TFoo.Create;
result := gUnitVarB;
end;
finalization
if assigned(gUnitVarB) then
gUnitVarB.free; //or FreeAndNil(gUnitVarB);
end;
unit unitA;
// code..
implementation
uses
unitB;
var
A: TStringList;
//code...
...UnitVarB....
//code...
initialization
A:= TStringList.Create;
finalization
A.Free;
end.
Мне кажетсяпомнить где-то, что инициализация модуля может быть дорогой в том смысле, что если модуль, на который вы больше не ссылаетесь напрямую, все еще находится в предложении использования во время компиляции, умный компоновщик не удалит его из-за раздела инициализации.Хотя это может показаться не таким уж плохим, если бы у каждого устройства была секция инициализации, тогда большинство программ на Delphi были бы на НАМНОГО больше, чем они уже есть.
Я не говорю, что не используйте их, но мое правило - использовать их экономно.
Ваш первоначальный пример кода нарушает это правило.Я думал, что упомяну это.
Райан