私はあなたのEDITがあなたの質問を本当に異なったものにするので、別の答えに入れています。
私はクライアントに手を差し伸べるのに少し時間がかかるので、この回答を後で延長する予定です。
この編集では、値の型、参照の型、var、out、const、およびパラメーターマーキングの影響について再考する必要があることを示しています。
まず、値の種類の処理をしましょう。
値型の値はスタック上に存在し、割り当て時コピー動作を持ちます。 (例をあげておきます)。
パラメータマーキングがない場合、メソッド(プロシージャまたは関数)に渡される実際の値は、メソッド内のそのパラメータのローカル値にコピーされます。したがって、このメソッドは渡された値ではなく、コピーで動作します。
out、varまたはconstがある場合、コピーは行われません。メソッドは渡された実際の値を参照します。 varでは、その実際の値を変更することができますが、constではそれが許可されません。アウトの場合、実際の値を読み取ることはできませんが、実際の値を書き込むことはできます。
参照型の値はヒープ上にあるため、out、var、const、またはパラメータマーキングがない場合はほとんど問題になりません。何かを変更すると、ヒープの値が変更されます。
参照型の場合、パラメーターマーキングがない場合でもコピーは取得されますが、これはヒープ上の値を参照している参照のコピーです。
これは、匿名メソッドが複雑になる場所です。変数の取り込みが行われる場所です。 編集した場合、匿名メソッドはリストのローカルコピーを取得します。匿名のメソッドはそのローカルコピーで動作し、コンパイラの観点からはすべてが大変です。
しかし、あなたの編集の要点は、 'それは正常なパラメータのために働く'と '匿名メソッドが実行されるたびに参照がまだ生きているオブジェクトを指し示していることを保証する'という組み合わせです。
匿名メソッドを使用するかどうかに関係なく、常に参照パラメータに問題があります。例えばこのため
:誰かが、doSomethingの呼び出したときにインスタンスがFValueポイントがまだ存在する場所ということを保証
procedure TMyClass.AddObject(Value: TObject);
begin
FValue := Value;
end;
procedure TMyClass.DoSomething();
begin
ShowMessage(FValue.ToString());
end;
? 答えは、FValueへのインスタンスがなくなったときにDoSomethingを呼び出さないようにする必要があります。 編集にも同じことが言えます。基礎となるインスタンスがなくなったときに匿名メソッドを呼び出すべきではありません。
これは、参照カウントまたはガーベッジコレクションのソリューションがより使いやすくなる領域の1つです。インスタンスが最後に参照されるまで生き残ります(インスタンスが元々予想より長く生き残る可能性があります)。 )。
あなたの編集では、匿名メソッドから実際に参照型パラメータとライフタイム管理を使用することの意味に変更されます。
私の答えは、あなたがその地域に行くのを助けてくれることを願っています。
--jeroen
参照されるパラメータの代わりにポインタを使用します。 – MajidTaheri