7

この質問に対する答えを調べていると、「匿名メソッド内で出力パラメーターが許可されないのはなぜですか?」 ラムダ式と匿名メソッドが実際にどのように機能するかについて少し迷っています。

コメントの中で、JaredPar は、「たとえば、out パラメータがスタック上のローカル変数を参照していると想像してください。ラムダは将来の任意の時点で実行できるため、そのスタック フレームが無効になったときに実行できます」と述べています。

他の変数ではそうではないかどうかを指摘しました...基本的に、ラムダ式について本当に何を知っているのか疑問に思います。

私が心に留めていることは、次のようなものです。

public void Foo(ComplexObject val, out SomeDelegate outDelegate)
{
  ComplexObject obj = new ComplexObject(val)
  SomeDelegate = delegate(int other) { return (obj.value * other); }  
}

public void Bar()
{
  SomeDelegate MyDel = null;
  Foo(5, out MyDel);
  int finalRes = MyDel(100);
  // Whatever
}

その状況では、何が起こっているのかよくわかりません。obj はスタック上の参照であり、メソッドの戻り時に有効ではなくなるため、匿名メソッドは (それが機能する場合) 実際にそれが参照型であることを認識し、値の代わりに参照をコピーできる必要があります... 「ユースケース」が多かれ少なかれ同じである場合、ref params が機能しないのはなぜですか?

4

2 に答える 2

8

クロージャが内部でどのように機能するかについて、かなり広範なブログシリーズを作成しました。クロージャのVB.Net実装用に作成されていますが、基本的な詳細はC#と非常によく似ています。それはあなたが探している答えを提供するはずです

他のすべての記事にリンクしているパート6へのリンクは次のとおりです

于 2009-10-28T16:41:23.987 に答える
6

JonSkeetが詳細な説明を書きました。

基本的に、コンパイラは外部メソッドをクラスに変換し、匿名メソッドによってアクセスされるすべての変数をクラスのフィールドに変換します。匿名メソッドは、クラスの通常のインスタンスメソッドになります。

于 2009-10-28T16:43:26.873 に答える