System.Assigned
Delphi
function Assigned(var P): Boolean;
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
function | public | System.pas | System | System |
説明
ポインタ変数や手続き変数が nil(代入されていない)かどうかを検査します。
Assigned を使用すると、P で参照されるポインタまたは手続きが nil かどうかを判定できます。P はポインタ型または手続き型の変数参照でなければなりません。
Assigned(P) は、ポインタ変数に対する P <> nil の検査や、手続き変数に対する @P <> nil の検査に相当します。
Assigned は、P
が nil であれば False を返し、そうでない場合は True を返します。
ヒント: 以下のように、イベント オブジェクトや手続きオブジェクトが代入済みかどうかを検査する場合、nil かどうかを直接検査することはできません。Assigned を使用するのが正しいやり方です。
var
LNotifyEvent: TNotifyEvent;
begin
if LNotifyEvent <> nil then { This is not OK and generates compiler error. }
Writeln('something');
if Assigned(LNotifyEvent) then { This is OK. }
Writeln('something');
end;
ヒント: 特定のケースでは、Assigned(Something) を使用する場合と Something <> nil を使用する場合で違いがあります。たとえば、以下のコードで、Assigned(LMyFunction) では
LMyFunction
変数が実際に代入済みかどうかを確認しているのに対して、LMyFunction<> nil では LMyFunction の結果値が代入済みかどうかを確認しています。
function MyFunction: Pointer;
begin
Result := nil;
end;
type
TMyFunction = function: Pointer;
var
LMyFunction: TMyFunction = MyFunction;
begin
Writeln('Statement "LMyFunction <> nil" evaluates to: ', LMyFunction <> nil);
Writeln('Statement "Assigned(LMyFunction)" evaluates to: ', Assigned(LMyFunction));
end.
出力は以下のようになります。
Statement "LMyFunction <> nil" evaluates to: FALSE Statement "Assigned(LMyFunction)" evaluates to: TRUE
メモ: Assigned では、ダングリング ポインタ(nil ではないが、有効なデータをもう指していないポインタ)を検出できません。たとえば、Assigned のコード例(SystemAssigned)では、Assigned は P が有効でないことを検出しません。