据我了解,您所拥有的应该是完全有效的。有点尴尬但有效。
但更好的方法可能是在单元 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.
我似乎记得某处单元初始化可能很昂贵,因为如果您不再直接引用的单元在编译期间仍在您的 uses 子句中,则智能链接器不会因为初始化部分而将其删除。虽然如果每个单元都有一个初始化部分,这听起来可能不是那么糟糕,但大多数 Delphi 程序将比它们已经大得多 。
我并不是说不要使用它们,但我的经验法则是谨慎使用它们。
您的初始代码示例违反了该规则。我想我会提到它。
瑞安