このブログでは C# を中心にプログラミングのトピックスを扱っています。コンストラクターやプロパティ、フィールドなど様々な内容を扱ってきました。この記事ではクラスのフィールドを指定するときのキーワード「this」を取り扱っていきたいと思います。
「this」とは「これ」という意味ですが、C#においては「クラスのフィールドを指定する場合に使うキーワード」になります。サンプルコードも混ぜていきながら、thisの使い方を解説していきます。近年の現場の案件では明示的に「this」を使用する場面は減っているような気がしますが、依然として重要な内容ですので押さえておきましょう。
thisのサンプルコード
早速ですがサンプルとしてコンソールアプリケーションを作成していきます。
using System;
namespace App01
{
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.SetName("Takashi");
string name = person.GetName();
Console.WriteLine("名前は" + name + "です。") ;
Console.ReadLine();
}
public class Person
{
private string name;
//名前を設定するメソッド
public void SetName(string name)
{
this.name = name;
}
//名前を取得するメソッド
public string GetName()
{
return name;
}
}
}
}
簡単なアプリケーションを作成してみました。Personクラスにフィールドが1つ、メソッドが2つ存在しているだけです。このアプリケーションから「this」の使い方を解説していきます。
フィールドとローカル変数を区別する
SetNameメソッドにて「this」の使い方をみることができます。以下のコードをみてみてください。
//名前を設定するメソッド
public void SetName(string name)
{
this.name = name;
}
「this.name = name;」となっている箇所がまさにそうです。このメソッドは引数としてstring型のnameという変数を受け取るようにしています。この引数(パラメータ)である「name」とフィールドの「name」を区別するために使用しています。
「this.name」としているのがフィールドであり、thisがついていないnameがローカル変数を指し示しています。流れとしては引数のname変数を、フィールドのnameに設定している感じです。
フィールドとパラメータが同じ名前であっても、きちんと区別することができます。ただし、thisを付けないと引数のnameが指定されてしまうので、以下の場合は要注意となります。
//名前を設定するメソッド
public void SetName(string name)
{
name = name;
}
SetNameメソッドの中身を上記のようにして、アプリケーションを実行してみると「名前はです。」となり、フィールドに対して値が設定されていないことが分かります。
thisが不要なケース
それでは次はthisが不要なケースを確認してみます。thisが不要な場合は、ローカル変数が存在しておらず、メソッド内でフィールドが判別できる場合になります。GetNameメソッドを見てみてください。
//名前を取得するメソッド
public string GetName()
{
return name;
}
先ほどのSetNameメソッドでは引数として、フィールドと同じ名前の変数を持っていため、どちらか判別を付けることが難しかったですよね。それに対してこのGetNameメソッド内は、nameと判別の付く変数はフィールドしか存在していません。
このように特定のスコープ内にあいまいな変数が存在していない場合は、フィールドの変数であると解釈されます。こうした場合は「this」を付与して、明示的にフィールドであることを示す必要はなくなります。
あいまいな時はthisを付けよう
以上、クラス内におけるthisの使い方について解説しました。明示的にthisを付けなければならない場面は少ないかもしれませんが、知っておかなければならないので、押さえておきましょう。
まとめると特定の範囲内に同一の名称を持つ要素が存在している場合、thisを付けるとフィールドを指し示し、thisを付けない場合は最もローカルな値を示すということになります。
あまり使うことはないかもしれませんが、知っておいて損のない内容ですし、ほかのソースを読むときに遭遇する可能性があるかもしれません。是非とも自分でアプリケーションを作成して、実際の使われ方を確認しておきましょう。