2

FreePascal にオブジェクトとしてカスタム イテレータがあるとします。

{$MODE OBJFPC}
....
type TLuaTablesEnumerator = object
private
  {...}
public
  constructor Create( aState : PLua_State; aIndex : Integer );
  destructor Destroy;
  function MoveNext : Boolean;
  function GetEnumerator : TLuaTablesEnumerator;
public
  property Current : TLuaTable read FCurrent;
end;  

Destroy常に呼び出される保証はありますか?ドキュメントには言及されていませんが、基本的なケースを試してみましたが、そのようです。

特に - はDestroy、次の場合にも常に呼び出されます。

  1. 通常どおりループを終了します
  2. Breakorを使用して途中でループを終了しますExit
  3. 発生した例外を介してループを終了します

これらの質問のいずれかに対する答えが「いいえ」である場合 (フォローアップの質問)、イテレータがクラスの場合は変更されますか?

4

1 に答える 1

2

いいえ。

Delphi と同じ デストラクタは、インターフェイスの参照カウントがゼロになった場合にのみ暗黙的に呼び出されます。(ただし、そのインターフェイスはオレバリアントにある可能性があります)。

TP オブジェクトは静的であり、FPC では、ネストされた自動化された型をさらに尊重します。ただし、デストラクタは引き続き明示的に呼び出す必要があります

インターフェイスの使用に関する質問はないため、答えはNOです。

于 2013-04-21T12:24:48.110 に答える