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

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

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

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

Q&A

解決済

2回答

1150閲覧

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

tommy_seiya

総合スコア32

C#

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

0グッド

1クリップ

投稿2022/05/20 22:57

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2022/05/21 00:45

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

退会済みユーザー

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 クラスでしか記述できません。 一方、単一インスタンスで使用されるものはシングルトンと呼ばれます。 両者とも、クラスの機能に制限を課すことによってプログラマの書けるコードの幅を狭め、可読性を上げるとともにバグの混入を防ぐ目的で使われます。
退会済みユーザー

退会済みユーザー

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
guest

回答2

0

ベストアンサー

static(静的である)クラスAを指している?のであれば

言語によってはそのような挙動をしますが、C#はそうではない、というだけの話です。

何が疑問なのかがわかりません。

投稿2022/05/21 00:26

編集2022/05/21 00:27
maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

thisってのは自身のインスタンスを指すキーワードなんで、staticクラスには存在しません

投稿2022/05/20 23:21

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問