あなたのEDITがあなたの質問を本当に違うものにするので、私はこれを別の答えに入れています。
クライアントに連絡するのが少し急いでいるので、おそらく後でこの回答を拡張します。
あなたの編集は、値の型、参照型、および var、out、const の影響、およびパラメーター マーキングなしについて再考する必要があることを示しています。
最初に値型のことをしましょう。
値型の値はスタック上に存在し、コピーオン割り当ての動作をします。(後でその例を含めようとします)。
パラメータ マーキングがない場合、メソッド (プロシージャまたは関数) に渡される実際の値は、メソッド内のそのパラメータのローカル値にコピーされます。したがって、このメソッドは渡された値ではなく、コピーに対して動作します。
out、var、または const がある場合、コピーは行われません。メソッドは、渡された実際の値を参照します。var の場合は実際の値を変更できますが、const の場合は変更できません。out の場合、実際の値を読み取ることはできませんが、実際の値を書き込むことはできます。
参照型の値はヒープ上に存在するため、out、var、const、またはパラメーター マーキングがない場合はほとんど問題になりません。何かを変更すると、ヒープ上の値が変更されます。
参照型の場合、パラメーター マーキングがない場合でもコピーを取得できますが、それはヒープ上の値を指している参照のコピーです。
ここで、無名メソッドが複雑になります。変数キャプチャを行います。(バリーはおそらくこれをもっとうまく説明できますが、試してみます) あなたの編集されたケースでは、匿名メソッドはリストのローカル コピーをキャプチャします。匿名メソッドはそのローカル コピーで機能し、コンパイラの観点からはすべてが適切です。
ただし、編集の要点は、「通常のパラメーターで機能する」と「匿名メソッドが実行されるたびに参照が生きているオブジェクトを指していることを保証する」の組み合わせです。
これは、匿名メソッドを使用するかどうかに関係なく、常に参照パラメーターの問題です。
たとえば、これ:
procedure TMyClass.AddObject(Value: TObject);
begin
FValue := Value;
end;
procedure TMyClass.DoSomething();
begin
ShowMessage(FValue.ToString());
end;
誰かが DoSomething を呼び出したときに、FValue が指しているインスタンスがまだ存在することを誰が保証しますか? 答えは、FValue のインスタンスが終了したときに DoSomething を呼び出さないことで、これを自分で保証する必要があるということです。同じことが編集にも当てはまります。基になるインスタンスが終了したときに匿名メソッドを呼び出すべきではありません。
これは、参照カウントまたはガベージ コレクション ソリューションによって生活が楽になる領域の 1 つです。そこでは、インスタンスへの最後の参照がなくなるまで、インスタンスは存続します (これにより、インスタンスが当初の予想よりも長く存続する可能性があります!)。
したがって、編集により、質問は実際には匿名メソッドから、参照型パラメーターと一般的なライフタイム管理を使用することの意味に変わります。
うまくいけば、私の答えがあなたがその分野に進むのに役立つことを願っています。
--jeroen