私が理解している限り、あなたが持っているものは完全に有効でなければなりません。少し厄介ですが有効です。
しかし、より良い方法は、ユニット B で変数を宣言し、B に初期化/ファイナライズさせることです。初期化は他のコードが呼び出される前に行われるため、ユニット A の uses 句で宣言されている限り、ユニット A で使用できるようになる前に初期化されます。
考慮すべきもう 1 つのステップは、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 プログラムは、現在よりもはるかに大きくなります。
私はそれらを使用しないと言っているわけではありませんが、私の経験則は控えめに使用することです.
最初のコード例はそのルールを破っています。挙げておこうと思いました。
ライアン