質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

解決済

staticメソッド内でthisキーワードを使用できない理由について

tommy_seiya
tommy_seiya

総合スコア32

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

2回答

0評価

1クリップ

332閲覧

投稿2022/05/20 22:57

c#でプログラミングをしていた際に生じた疑問です。
オブジェクト指向プログラミングならびに、staticクラス・メソッドに対する理解を深める意味でも、質問させていただきたいと思います。

staticメソッド内で、thisキーワードを使用するとエラーメッセージが表示されてしまいます。
そもそもstaticメソッド内では、staticでないメンバーを参照できないと思いますが、staticクラス(クラスAとする)のstaticメソッド(メソッドBとする)内で記述する"this"は何を指すのでしょうか?
static(静的である)クラスAを指している?のであれば、何が問題となっているのでしょう?

「Microsoft Docs」には"静的メンバー関数は、クラス レベルで存在し、オブジェクトの一部ではないため、this ポインターがありません。 静的メソッドで this を参照するとエラーになります。"などと説明がありましたが、いまいちピンとこなかったため、分かりやすくご説明いただければ幸いです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

dodox86

2022/05/21 00:45

> そもそもstaticメソッド内では、staticでないメンバーを参照できないと思いますが、staticクラス(クラスAとする)のstaticメソッド(メソッドBとする)内で記述する"this"は何を指すのでしょうか? 疑問の発端が反対な気がしますが、staticメソッド内でthisキーワードを使うとコンパイルエラーになって、要は記述できないのですよね。それともそう記述している何かサンプルコードのようなものがあるのでしょうか。
SurferOnWww

2022/05/21 01:37

> 静的メンバー関数は、クラス レベルで存在し、オブジェクトの一部ではないため、this ポインターがありません。 静的メソッドで this を参照するとエラーになります。 仕様ということで納得できないのはどういう理由でしょうか?
tommy_seiya

2022/05/21 04:51

"this"が指すのはあくまで"インスタンス"であり、 「staticクラスであること」は「ただ1つの"インスタンス"として存在している」わけではないという認識が薄れていました。この頃、フォーム画面など本来複数存在しえないクラスのメソッド内で"this"を記述する機会が多かったためでしょうか。 コーディング時には、インテリセンス機能により、staticでないクラスであればクラス名まで記述することで候補が出てくれるため、ほしいプロパティがそのクラス上で取れそうかパッと確認ができます。疑問の発端はそのようなクセにあったように思います。 いずれにせよ、staticクラスはインスタンスを持たず、thisが本来指すのは、「複数存在しうるインスタンスのうち、他の何物でもない、今そのメソッドを実行しているオブジェクト(自分自身)」ということで、staticメソッド内で記述できないのも当然といえば当然でした。
tommy_seiya

2022/05/21 05:02

どちらかというと、フォーム画面などのクラスをstaticクラスに近いモノとして使ってしまっていることに問題があるかもしれません。 「インスタンスが複数生成されない」ということだけが"staticクラス"のミソではないですよね?インスタンスとはまた違った形の実体が、最初に呼び出されて以降、存在し続けるという点が"staticでないクラス"との大きな違いでしょうか。
Zuishin

2022/05/21 05:23

static クラスというのは、Object クラスから継承したもの以外のインスタンスメンバーを持たず、インスタンス化できないクラスのことです。 Form は基本的にインスタンス化して使い、static クラスにはなれません。 static クラスは「インスタンス化しないでください」という設計者の意図を他のプログラマに伝えるために使われ、状態を持たないことを明示しています。 これが提供するのは関数であり、関数言語的な使用が期待されます。 拡張メソッドは static クラスでしか記述できません。 一方、単一インスタンスで使用されるものはシングルトンと呼ばれます。 両者とも、クラスの機能に制限を課すことによってプログラマの書けるコードの幅を狭め、可読性を上げるとともにバグの混入を防ぐ目的で使われます。
SurferOnWww

2022/05/21 06:54 編集

> 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

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。