このようなクラス名だけで静的メンバーにアクセスできることを知っています
Myclass.MyStaticMember
これを初期化する必要はありません
しかし、私の質問は、初期化オブジェクトから静的メンバーにアクセスできない理由です
Myclass.MyStaticMember obj =new Myclass.MyStaticMember()
obj.MyStaticMember
CLRまたは.netフレームワークアーキテクチャまたはコンパイラを介して関連がありますか
このようなクラス名だけで静的メンバーにアクセスできることを知っています
Myclass.MyStaticMember
これを初期化する必要はありません
しかし、私の質問は、初期化オブジェクトから静的メンバーにアクセスできない理由です
Myclass.MyStaticMember obj =new Myclass.MyStaticMember()
obj.MyStaticMember
CLRまたは.netフレームワークアーキテクチャまたはコンパイラを介して関連がありますか
コードをより明確にすることは、言語の決定です。( C# コンパイラがコンパイル時の変数の型に基づいてコードを静的アクセスにコンパイルすることは完全に実行可能でした。) 次のように記述した場合:
obj.StaticMember
メンバーは - に固有のように見えますobjが、そうではありません。コードは嘘をつくべきではありません。
これがいかに混乱を招く可能性があるかを示す例として、次の有効な Java コードを考えてみましょう (Runnable変数が という名前であると仮定しますrunnable)。
Thread thread = new Thread(runnable);
thread.start();
thread.sleep(1000);
それはどのスレッドをスリープ状態にしますか? sleep()新しいスレッドはもちろん、新しいスレッドを参照する変数を呼び出しています。もちろん、現在実行中のスレッドを常にスリープ状態にするThread.sleep静的メソッドは除きます。上記のコードからはまったく明らかではありません。幸いなことに、C# では有効ではありません。
これは、C# チームが Java の過ちから学んだように見える領域の 1 つであり、私はとても嬉しく思います。(他の側面については残念ですが、ちょっと...)
静的メンバーは、 a の特定のインスタンスに「属していません」Type T-ある意味では、タイプ自体に属しています。
実際の「値」は、CLR の詳細の対応する深い部分に関連付けられておりEEClass、そのタイプのすべてのインスタンスで共有されます。