この章のテーマ §
thisキーワードについて学びます。thisは自分自身を参照する手段です。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, クラスの基礎, コンストラクタの基礎
解説 §
thisキーワードはC#の様々な場所で見られるキーワードです。
ここでは特によく見かける使い方を2つ説明します。
1つめはオブジェクトのインスタンスにおいて、自分自身を参照する方法です。サンプルソースでは、クラスのメンバーと引数に同じtheValueという名前が存在します。しかし、これを区別して処理できねば引数の値でプロパティを初期化できません。そういう時は、thisの出番です。thisは自分自身のインスタンスを指し示す特別な値です。これを経由すると必ずオブジェクトのメンバーにアクセスできます。this抜きだと引数の方を参照します。
もう1つはコストラクタの利用です。thisキーワードを使うと【同じ型の別の引数バリエーションのコンストラクタを先に呼ぶ】という機能性を記述できます。サンプルソースの場合、引数のあるバリエーションと引数のないバリエーションのコンストラクタが用意されていますが、引数のないコストラクタからは、引数のあるコストラクタに1という値を指定して呼び出しています。このようにして呼び出した場合、双方のコンストラクタがどちらも実行されることに注意して下さい。
罠の数々 §
- メンバー参照のthisは、静的なメンバーに対して使用できない。thisはあくまでインスタンスを指し示すものである (静的なメンバーはインスタンスに含まれない)
- thisは常にそのインスタンスを指し示す。インスタンスが変わればthisの値も変わる
参考リンク §
コンストラクターの使用 (C# プログラミング ガイド)
サンプルソース: kw_this §
var a1 = new MySample();
Console.WriteLine(a1.theValue);
var a2 = new MySample(2);
Console.WriteLine(a2.theValue);
class MySample
{
public int theValue { get; set; }
public MySample(int theValue)
{
this.theValue = theValue;
Console.WriteLine("コンストラクタ1号");
}
public MySample() : this(1)
{
Console.WriteLine("コンストラクタ2号");
}
}
実行結果 §
コンストラクタ1号
コンストラクタ2号
1
コンストラクタ1号
2
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
new B();
public class A
{
public void sub() => Console.WriteLine("A");
}
public class B:A
{
public new void sub() => Console.WriteLine("B");
public B()
{
((A)(this)).sub();
}
}
- A
- B
- AとB
- BとA
- コンパイルエラー
[[解答]]