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

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

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

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

Q&A

6回答

1205閲覧

C#のクラスのthisについての質問です

kanan_py

総合スコア7

C#

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

0グッド

0クリップ

投稿2020/09/15 08:45

thisを使うときはたいてい同じ名前のローカル変数とインスタンス変数を区別するためにインスタンス変数にthisをつけると思うのですが、わざわざインスタンス変数とローカル変数の名前を同じにする必要性があると僕は思えないのですが、どういった状況にthisの効果が発揮されるのでしょうか?それとも僕のthisの認識の仕方が間違っているのでしょうか?よろしくお願いします。

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

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

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

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

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

guest

回答6

0

this自体は、別にフィールド変数とローカル変数を区別する為にあるのではなく、その本来の一番の仕事は、メソッドが自インスタンスへとアクセスする為にあります。
メソッドはインスタンスメソッドであっても実はインスタンス内には無く、クラスの一部として存在しています。
その為、呼び出されたメソッド自身は、自分の所属するインスタンスが何処にあるのかを知りません。
そのメソッドに、インスタンスの場所を知らせる為に、隠し引数として、デフォルトで渡されるのがthisです。
メソッドは、thisにあるインスタンスへの参照を経由する事で初めて、自分のインスタンスのデータにアクセス可能になります。
なので、thisは、明示的に付けてもつけなくても、フィールドへのアクセスには内部で自動的に付加されています。
わざわざ付けるというよりはじめから基本的に付いているものと思うと違和感は少し減るかも知れません。

引数もフィールドも、1番自然な名前を付ける。
それが被っていてもいなくても、フィールドにはthisを付ける。
そうすれば、どこにアクセスしているかがより明確化されるし、うっかり衝突を防ぐ事にもなる。
ぐらいに考えると良いんじゃないかな、と思います。

投稿2020/09/15 14:00

amiya

総合スコア1218

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

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

0

どういった状況にthisの効果が発揮されるのでしょうか?

メソッドチェーンなどでthisを返り値にする場合は、他の選択肢はありません。

投稿2020/09/15 09:12

maisumakun

総合スコア145208

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

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

0

わざわざインスタンス変数とローカル変数の名前を同じにする必要性があると僕は思えない

という話と,

「わざわざ「自然な名前」を避けて別名を捻り出さずとも,thisで明示すればそれで済むじゃん?」

という話を天秤にかけて,後者が勝る場合.

投稿2020/09/15 09:10

fana

総合スコア11708

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

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

0

わざわざインスタンス変数とローカル変数の名前を同じにする必要性があると僕は思えない

わざわざ、ではなく、他に適切な名前の候補がない場合などに同名になるケースは存在します。
例えばクラス内に保持したい値をコンストラクタで受け取る場合などです。
全く同じものなのに、違う名前を付ける方が混乱の元です。

どういった状況にthisの効果が発揮されるのでしょうか?

メソッドに自分自身を受け渡したい場合xxx.SomeMethod(this);というような使い方をするケースがあります。

投稿2020/09/15 08:58

gentaro

総合スコア8949

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

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

0

Java などでの引数付きコンストラクタ(オブジェクト生成と同時にフィールドに値を入れる)だと、
仮引数がフィールド名と同名にした方が分かりやすい、というのはあり、その場合に名前衝突の可能性が出てきますかね。

まあ、this を付けて明示した方が、あとでコードリーディングするときにわかりやすいと思います。

投稿2020/09/15 08:58

tacsheaven

総合スコア13703

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

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

0

thisは自分のインスタンスを指します

わざわざインスタンス変数とローカル変数の名前を同じにする必要性があると僕は思えないのですが

これは全くそのとおりです。
あなたはこのようなことのないよう、頑張ってください

どういった状況にthisの効果が発揮されるのでしょうか?

thisをつけることで、クラス変数を指している、と明示することができてわかりやすくなりますね

投稿2020/09/15 08:48

編集2020/09/15 08:52
y_waiwai

総合スコア87802

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

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

gentaro

2020/09/15 09:04

> これは全くそのとおりです。 受け取った値をフィールドに保持するような場合にどのように名前の衝突を避けるんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問