web-dev-qa-db-ja.com

オブジェクト参照がC#の静的メンバーにアクセスできないのはなぜですか

私の質問のコンテキスト:

  1. 私はC#を読んでいます。
  2. 静的キーワードを理解しようとしています。
  3. Staticをクラスのメンバーに適用すると、クラスによってのみ変更でき、クラスオブジェクト参照では変更できないことを理解しています。

ここで例を挙げます。

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キーワードがまったく必要な理由の基本的な概念を知りたいのですが。

クラスオブジェクト参照が静的メンバーにアクセスできる場合、何が問題になりますか?

5
Suyash

インスタンスから静的メンバーにアクセスしても問題はありません。実際、これはJavaのような他の言語でも完全に可能です。サンプルコードは、Javaであればコンパイルして問題なく実行できます。

これは、プログラマーがこの言語で明確なコードを書くのに役立つと考えたため、コンパイラー設計者が導入したチェックです。この方法では、コードを見ているだけで、staticまたはインスタンスメンバーにアクセスしているかどうかを常に知ることができます。このアクセスが許可されている言語(Javaなど)では、誰かがアクセスすることを決定したときに少し混乱することがあります。インスタンス変数全体のstaticメンバー。実際には、通常、このアクセスがJavaでコーディングされている場合、この「言語機能」を実際に使用しているプログラマーよりも間違いです。

私の意見では、これへのアクセスを制限することは、C#でいくつかの間違いや悪い解釈を回避するための適切な決定です。

Javaでstaticメンバーを参照することはlegalですが、コード規約( 10.2クラス変数とメソッドへの参照 ):

「オブジェクトを使用してクラス(静的)変数またはメソッドにアクセスすることは避けてください。代わりにクラス名を使用してください...」

10
AlfredoCasado

次の(法的)Javaコードを検討してください。

Thread workerThread = new MyWorkerThread();
workerThread.start();
workerThread.sleep(5000);

一見すると、最後の行はworkerThreadが5秒間スリープすることを要求しているようです。ただし、 Thread.sleep メソッドは実際にはstaticであり、currentスレッドをスリープ状態にします。

C#では、インスタンスではなくクラスを通じてstatic関数を呼び出す必要があるため、このような誤解を招くコードを作成するのを防ぐことができます。

23
dan04

クラスオブジェクト参照が静的メンバーにアクセスできる場合、何が問題になりますか?

重要なのはリファレンスではなく、リファレンスはあなたがどのインスタンスを扱っているかを知るためのものです。 staticメンバーはこのように機能します。それらはクラスの一部ですが、そのクラスから派生したインスタンスの一部ではありません。

これが機能する方法だと理解しています。しかし、Staticキーワードがまったく必要な理由の基本概念を知りたいのですが。

OOPが成熟する前は、個々のオブジェクトの初期化を可能にするランタイム環境はありませんでした。プログラムは基本的に、相互にまとまって呼び出されるサブルーチンのコレクションでした。これは「静的」と考えることができます。 OOPが成熟しても、独立したクラスのアイデアは無条件にアクセスできるため、魅力的です。ランタイムレベルでは、静的クラスもインスタンスのようなものですが、そうではありませんこれは静的メンバーなどもありますが、非同期操作で予期しない動作を引き起こす可能性があるため、非静的クラスと組み合わせることは珍しいことです。これはstatic readonlyメンバーには適用されないことに注意してください。

0