2

このようなクラス名だけで静的メンバーにアクセスできることを知っています

Myclass.MyStaticMember

これを初期化する必要はありません

しかし、私の質問は、初期化オブジェクトから静的メンバーにアクセスできない理由です

Myclass.MyStaticMember obj =new  Myclass.MyStaticMember()
obj.MyStaticMember

CLRまたは.netフレームワークアーキテクチャまたはコンパイラを介して関連がありますか

4

2 に答える 2

7

コードをより明確にすることは、言語の決定です。( C# コンパイラがコンパイル時の変数の型に基づいてコードを静的アクセスにコンパイルすることは完全に実行可能でした。) 次のように記述した場合:

obj.StaticMember

メンバーは - に固有のように見えますobjが、そうではありません。コードは嘘をつくべきではありません。

これがいかに混乱を招く可能性があるかを示す例として、次の有効な Java コードを考えてみましょう (Runnable変数が という名前であると仮定しますrunnable)。

Thread thread = new Thread(runnable);
thread.start();
thread.sleep(1000);

それはどのスレッドをスリープ状態にしますか? sleep()新しいスレッドはもちろん、新しいスレッドを参照する変数を呼び出しています。もちろん、現在実行中のスレッドを常にスリープ状態にするThread.sleep静的メソッドは除きます。上記のコードからはまったく明らかではありません。幸いなことに、C# では有効ではありません。

これは、C# チームが Java の過ちから学んだように見える領域の 1 つであり、私はとても嬉しく思います。(他の側面については残念ですが、ちょっと...)

于 2013-03-01T18:32:39.140 に答える
1

静的メンバーは、 a の特定のインスタンスに「属していません」Type T-ある意味では、タイプ自体に属しています。

実際の「値」は、CLR の詳細の対応する深い部分に関連付けられておりEEClass、そのタイプのすべてのインスタンスで共有されます。

于 2013-03-01T18:34:18.807 に答える