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

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

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

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

4回答

34219閲覧

C#での「this」

ARADDIO

総合スコア160

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

1クリップ

投稿2014/10/08 00:32

お世話になっています。

<質問内容>
C#でのthis キーワードについてですが、これを使う意味がわかりません。

<知りたいこと>
thisキーワードを使う意味・必要性・または利点は?

<補足>
MSDNには以下のように記述してあります。

this キーワードは、クラスの現在のインスタンスを参照します。拡張メソッドの最初のパラメーターの修飾子としても使用されます。

試しにWindows Formアプリケーションを作成し適当にthis.と記述してthisの中身を参照したら確かに現在実行中のクラスのインスタンスが作られているようです。

ですが、実際にはthis.を省略してもコントロールや変数にはアクセスできますし、記述するメリットがよくわかりません。

C#に知見のある方お願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

今のC#だとクラスに"メンバ変数"を使う代わりに"プロパティ"という機能が搭載されてしまったので、コンストラクタを作って、メンバ変数を初期化なんてしないですよね。フォームアプリだと自動でつくってしまいますし。

なのでthisを理解できる機会が少ないのではないかと思います。実際私はC#ではthisはほとんど使っていませんね.

Javaの"オブジェクト指向"のプログラミングではよくコンストラクタを使うのでthisが理解できるのではないかと思います。

thisの意味に関して:
"this"の意味ですが私は"自分自身"という意味でとらえて理解しています。
簡単な例で言うと

public class Person{
//メンバ変数 普通修飾詞はprivateです
private string name;
private int weight;
private int height;

//コンストラクタ thisがついている方が"自分自信"で、ついていない方が"外部からもらった引数の値"
//こうするとthis(自分自信).nameと外部引数のnameと同じ変数の名前でも、どっちか分りますよね。
public Person(string name,int weight,int height){
this.name = name;
this.weight = weight;
this.height = height;
}
}

static void Main(string[] args)
{
//Mainインスタンスを宣言する際はperson1やperson2がthis(自分自信)にあたります。
//だから基本Mainではthisは使いませんよね
Person person1 = new Person("Mark",170,60);
Person person2 = new Person("Mary",160,48);
}

thisの必要性:
オブジェクト指向プログラミングでthis(自分自身),super(親)などのキーワードは重要なので理解しておく必要はあると思います。

thisを使う利点:
自分自身を明確にすることができる点かなと思います。ただ、C#はプロパティーという機能が追加されたのでなかなか使う機会がありません。

とりあえずオブジェクト指向にはthisやsuperは必要な考え方なので覚えないといけないかと!

投稿2014/10/09 13:44

Tomapo2525

総合スコア20

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

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

ARADDIO

2014/10/10 08:10

回答ありがとうございます。 頂いたサンプルソースベースで少し考えてみました。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Person InstanceP = new Person(); int p; p = InstanceP.Persons("太郎", 45, 165); MessageBox.Show(p.ToString()); } } public class Person { //メンバ変数 普通修飾詞はprivateです private string name; private int weight; private int height; //コンストラクタ thisがついている方が"自分自信"で、ついていない方が"外部からもらった引数の値" //こうするとthis(自分自信).nameと外部引数のnameと同じ変数の名前でも、どっちか分りますよね。 public int Persons(string name, int weight, int height) { name = name; this.weight = 55; // ここでthisをつけることで明示的にPersonクラスのweightだということを示せる weight = weight; height = height; return this.weight; } } } 実行すると、Load時に55が表示されます。 thisをつけていないと45が表示されました。 このようにして使い分けるのですね。  # プログラマが変数名を意識的に別のものにすればいらない気もするのですがそこはどうなのでしょうか
Tomapo2525

2014/10/12 09:42

>> #プログラマが変数名を意識的に別のものにすればいらない気もするのですがそこはどうなのでしょうか それだと一つのパロメーターに対して二つの名前が存在してしまうことになってしまいますからオブジェクト指向向きではないかと思います。 たしかに別の名前の変数にしてもプログラム上問題ないかと思います。 でもそれだとオブジェクトにthis用のメンバ変数名と引数用のメンバ変数名のふたつの名前が必要になったりして、仕様書が複雑になったり、他人がそのコードを見た時に見づらくなってしまうかと思われます。
ARADDIO

2014/10/13 23:56

直近の現場でEXCEL VBAをよく利用していたので別の変数名にすることが普通のような感覚に陥っていたようです。 >>でもそれだとオブジェクトにthis用のメンバ変数名と引数用のメンバ変数名のふたつの名前が必要になったりして、仕様書が複雑になったり、他人がそのコードを見た時に見づらくなってしまうかと思われます。 なるほどたしかにそうですね。 そういう意味でも、thisへの理解が必須ということがわかりました。 解決しましたので本質問は閉じさせていただきます。ありがとうございました。
guest

0

C#に限った話ではないですが、thisが必要になるひとつの例としては、メンバ名とほかの変数名が重複している場合というのがあります。
this.a = a;のようなことです。
これはthisがないと不明瞭になるのでコンパイルエラーです。
コンストラクタ、プロパティ、セッタなどで使うと思います。

自分自身を別の処理に渡したいときにも使います。
func(this);のようなことです。

C#特有の構文としては、既存クラスに対する拡張メソッドというものがあります。
この場合はクラス名の前にthisを付けて定義します。これはこういう構文なので、そう書くとしか言いようがありません。

投稿2014/10/08 00:41

TaMaMhyu

総合スコア1356

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

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

0

自分自身をメソッドに渡す例とも関連しますが、オブジェクト間の関連を保持するのにもthisは使いますね。

lang

1public class Person { 2 public Person parent {get;set;} 3 .... 4 public Person makeChild() { 5 var child = new Person(); 6 child.parent = this; 7 return child; 8 } 9 public static void Main(string[] args) { 10 var person = new Person(); 11 var child = person.makeChild(); 12 var parent = child.parent; 13 } 14}

これで、childはpersonをparentとして持つわけです。

投稿2015/02/20 15:38

shinosan

総合スコア209

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

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

0

baseの存在とセットで考えないとだめじゃない?

投稿2015/02/20 11:44

Ryzna

総合スコア85

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問