c#でプログラミングをしていた際に生じた疑問です。
オブジェクト指向プログラミングならびに、staticクラス・メソッドに対する理解を深める意味でも、質問させていただきたいと思います。
staticメソッド内で、thisキーワードを使用するとエラーメッセージが表示されてしまいます。
そもそもstaticメソッド内では、staticでないメンバーを参照できないと思いますが、staticクラス(クラスAとする)のstaticメソッド(メソッドBとする)内で記述する"this"は何を指すのでしょうか?
static(静的である)クラスAを指している?のであれば、何が問題となっているのでしょう?
「Microsoft Docs」には"静的メンバー関数は、クラス レベルで存在し、オブジェクトの一部ではないため、this ポインターがありません。 静的メソッドで this を参照するとエラーになります。"などと説明がありましたが、いまいちピンとこなかったため、分かりやすくご説明いただければ幸いです。
> そもそもstaticメソッド内では、staticでないメンバーを参照できないと思いますが、staticクラス(クラスAとする)のstaticメソッド(メソッドBとする)内で記述する"this"は何を指すのでしょうか?
疑問の発端が反対な気がしますが、staticメソッド内でthisキーワードを使うとコンパイルエラーになって、要は記述できないのですよね。それともそう記述している何かサンプルコードのようなものがあるのでしょうか。

> 静的メンバー関数は、クラス レベルで存在し、オブジェクトの一部ではないため、this ポインターがありません。 静的メソッドで this を参照するとエラーになります。
仕様ということで納得できないのはどういう理由でしょうか?
"this"が指すのはあくまで"インスタンス"であり、
「staticクラスであること」は「ただ1つの"インスタンス"として存在している」わけではないという認識が薄れていました。この頃、フォーム画面など本来複数存在しえないクラスのメソッド内で"this"を記述する機会が多かったためでしょうか。
コーディング時には、インテリセンス機能により、staticでないクラスであればクラス名まで記述することで候補が出てくれるため、ほしいプロパティがそのクラス上で取れそうかパッと確認ができます。疑問の発端はそのようなクセにあったように思います。
いずれにせよ、staticクラスはインスタンスを持たず、thisが本来指すのは、「複数存在しうるインスタンスのうち、他の何物でもない、今そのメソッドを実行しているオブジェクト(自分自身)」ということで、staticメソッド内で記述できないのも当然といえば当然でした。
どちらかというと、フォーム画面などのクラスをstaticクラスに近いモノとして使ってしまっていることに問題があるかもしれません。
「インスタンスが複数生成されない」ということだけが"staticクラス"のミソではないですよね?インスタンスとはまた違った形の実体が、最初に呼び出されて以降、存在し続けるという点が"staticでないクラス"との大きな違いでしょうか。
static クラスというのは、Object クラスから継承したもの以外のインスタンスメンバーを持たず、インスタンス化できないクラスのことです。
Form は基本的にインスタンス化して使い、static クラスにはなれません。
static クラスは「インスタンス化しないでください」という設計者の意図を他のプログラマに伝えるために使われ、状態を持たないことを明示しています。
これが提供するのは関数であり、関数言語的な使用が期待されます。
拡張メソッドは static クラスでしか記述できません。
一方、単一インスタンスで使用されるものはシングルトンと呼ばれます。
両者とも、クラスの機能に制限を課すことによってプログラマの書けるコードの幅を狭め、可読性を上げるとともにバグの混入を防ぐ目的で使われます。

> staticメソッド内でthisキーワードを使用できない理由について
Microsoft のドキュメントにある「this キーワードはクラスの現在のインスタンスを参照します」と「静的クラスは基本的には非静的クラスと同じですが、静的クラスはインスタンス化できないという点が異なります」だけで上記の理由の説明になっていると思うのですが、それとは別に static クラス/メソッドとは何なのかという疑問があったということでしょうか?
であれば以下のドキュメントを読んでみてはいかがでしょう。すでにご存じかもしれませんが・・・
静的クラスと静的クラス メンバー (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members

回答2件
あなたの回答
tips
プレビュー