私の質問のコンテキスト:
ここで例を挙げます。
public class BluePrint
{
public static string BluePrintCreatorName;
}
BluePrintCreatorの名前を知る必要がある場合は、
BluePrint.BluePrintCreatorName;
しかし、ブループリントから作成された家がBluePrintCreatorの名前を知りたい場合は、アクセスできません。
BluePrint NewHouse = new BluePrint();
NewHouse.BluePrintCreatorName; //This is not accessible
コンパイラエラーは言う:
Member 'AccessModifier.BluePrint.BluePrintCreatorName' cannot be accessed
with an instance reference; qualify it with a type name instead
私は理解しています これが動作する方法です 。しかし、Staticキーワードがまったく必要な理由の基本的な概念を知りたいのですが。
クラスオブジェクト参照が静的メンバーにアクセスできる場合、何が問題になりますか?
インスタンスから静的メンバーにアクセスしても問題はありません。実際、これはJavaのような他の言語でも完全に可能です。サンプルコードは、Javaであればコンパイルして問題なく実行できます。
これは、プログラマーがこの言語で明確なコードを書くのに役立つと考えたため、コンパイラー設計者が導入したチェックです。この方法では、コードを見ているだけで、static
またはインスタンスメンバーにアクセスしているかどうかを常に知ることができます。このアクセスが許可されている言語(Javaなど)では、誰かがアクセスすることを決定したときに少し混乱することがあります。インスタンス変数全体のstatic
メンバー。実際には、通常、このアクセスがJavaでコーディングされている場合、この「言語機能」を実際に使用しているプログラマーよりも間違いです。
私の意見では、これへのアクセスを制限することは、C#でいくつかの間違いや悪い解釈を回避するための適切な決定です。
Javaでstatic
メンバーを参照することはlegalですが、コード規約( 10.2クラス変数とメソッドへの参照 ):
「オブジェクトを使用してクラス(静的)変数またはメソッドにアクセスすることは避けてください。代わりにクラス名を使用してください...」
次の(法的)Javaコードを検討してください。
Thread workerThread = new MyWorkerThread();
workerThread.start();
workerThread.sleep(5000);
一見すると、最後の行はworkerThread
が5秒間スリープすることを要求しているようです。ただし、 Thread.sleep メソッドは実際にはstatic
であり、currentスレッドをスリープ状態にします。
C#では、インスタンスではなくクラスを通じてstatic
関数を呼び出す必要があるため、このような誤解を招くコードを作成するのを防ぐことができます。
クラスオブジェクト参照が静的メンバーにアクセスできる場合、何が問題になりますか?
重要なのはリファレンスではなく、リファレンスはあなたがどのインスタンスを扱っているかを知るためのものです。 static
メンバーはこのように機能します。それらはクラスの一部ですが、そのクラスから派生したインスタンスの一部ではありません。
これが機能する方法だと理解しています。しかし、Staticキーワードがまったく必要な理由の基本概念を知りたいのですが。
OOPが成熟する前は、個々のオブジェクトの初期化を可能にするランタイム環境はありませんでした。プログラムは基本的に、相互にまとまって呼び出されるサブルーチンのコレクションでした。これは「静的」と考えることができます。 OOPが成熟しても、独立したクラスのアイデアは無条件にアクセスできるため、魅力的です。ランタイムレベルでは、静的クラスもインスタンスのようなものですが、そうではありませんこれは静的メンバーなどもありますが、非同期操作で予期しない動作を引き起こす可能性があるため、非静的クラスと組み合わせることは珍しいことです。これはstatic readonly
メンバーには適用されないことに注意してください。