3
  • C# の仕様から、参照の読み取り/書き込みはアトミックであることがわかっています。オブジェクトのメンバーにアクセスするステートメントでは、参照もアトミックにアクセスされますか? コンパイラがコードを生成する際に原子性を提供しなければならない一種の暗黙的な参照読み取りでもあるため、私はそう思います。

  • 同じステートメントで、オブジェクトにアクセスしてそのメンバーにアクセスすると、オブジェクト参照が保持されるため、別のスレッドによって新しいインスタンスが作成されたときにガベージ コレクションが行われませんか?

  • では、チェーン内のメンバーにアクセスする場合、一番左のオブジェクト参照も保持されるので、他のスレッドによってガベージ コレクションが行われることはありませんか?

次のコードを検討してください。

static SomeClass sharedVar;

void someMethod()
{
    SomeClass someLocalVar = sharedVar.memberX.memberY.a;
    operations on someLocalVar...
}

MSDN ライブラリ、C# 仕様など、または Microsoft の人々から、この件名に関する公式の説明を探して、何かを壊していないこと、およびすべてが正常であることを確認しています。

4

2 に答える 2

3
  1. はい、すべての参照読み取りはアトミックです。
  2. フィールド読み取り操作中、値がスタックにプッシュされてから .ldfld コマンドが完了するまで、参照を収集できません。そうしないと、使用していたオブジェクトを CLR が収集できるようになります。別のスレッドに値のインスタンスを作成させることは、この問題とは無関係です。
  3. この最後の点が何を意味するのか完全にはわかりませんが、ガベージ コレクションについて少し心配しすぎていると思います。CLR は、使用中のオブジェクトを削除しません。
于 2009-11-13T16:12:57.280 に答える
0

あなたはGCについて心配しすぎています。将来のある時点で参照およびアクセスできるオブジェクトは削除されません。完全にアクセスできないオブジェクトのみが削除されます。

于 2009-11-13T16:15:10.643 に答える