9

http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/async-await-faq.aspxによると、awaitキーワードはunsafeブロック内では禁止されており、「管理されていないポインターを保持することに固有の難しさ」のみが言及されています。 ' それらの困難が何であるかについて、利用可能な適切な説明はありますか?

4

1 に答える 1

8

知っておくべき2つの基本的なこと。非同期メソッドは、C# コンパイラによって、ステート マシンをラップする言いようのない名前の小さなクラスに書き換えられます。async メソッドのローカル変数は、そのクラスのフィールドになります。

安全でないコードは、多くの場合、ローカル変数へのポインターを作成できることに依存しています。fixedステートメントはそのようなもので、ガベージ コレクターが参照できる非表示のローカル変数を作成し、固定されている配列を移動するガベージ コレクションが発生したときに更新します。ローカル変数へのポインターを作成することは問題ありません。これらの変数は、ガベージ コレクターによって移動されることはありません。スレッドのスタックは、常に仮想メモリ アドレス空間の固定位置にあります。

この 2 つを接続すると、ローカル変数がクラスのフィールド (ガベージ コレクションが発生するとアドレスが変わるフィールド) に変わる可能性があることがわかります。安全でないコードを突然破壊コードに変える。

問題を示すコード スニペット:

class Example {
    int field;
    unsafe void Method() {
        int local = 42;
        int* p = &local;   // fine
        int* q = &field;   // CS0212
    }
}

C# チームは、安全でないコードが書き直されても問題ないケースを注意深く分析する努力をすることができたはずです。ただし、 fixedステートメントのように、修正できない場合もあります。多くの場合、戸惑うような理由で、プログラマーに残念なニュースを伝えるだけの一連の作業。ここで行うべき正気のことは、安全でないコードを立ち入り禁止と宣言することでした。

于 2013-03-03T19:28:03.527 に答える