staticなメソッドでは、このようなことは起こりません。インデクサのthisも同様です。
従ってstaticなインデクサが存在しないというのも納得できます。thisはどんなときに使うのでしょうか。次の例を見てください。
// this01.cs using System; class MyClass { public int x; public void show(int x) { Console.WriteLine("x = {0}", x); Console.WriteLine("this.x = {0}", this.x); } } class this01 { public static void Main() { MyClass mc = new MyClass(); mc.x = 100; mc.show(20); } }MyClassクラスには、インスタンスフィールドのxがあります。
このクラスには、またxというパラメータを持つshowというインスタンスメソッドがあります。
さて、showメソッドでは最初に
Console.WriteLine("x = {0}", x);としていますが、この時xはパラメータのxとなります。一方、
Console.WriteLine("this.x = {0}", this.x);this.xとすると、「このオブジェクトのx」という意味になりフィールドのxを指すことになります。
この場合、show(int y)とでもすれば、わざわざthisを使うまでもないのですが・・・・。
実行結果は当然次のようになります。
さて、第24章でコンストラクタのオーバーロードをやりました。
あるコンストラクタがthisを使って、他のバージョンのコンストラクタを呼び出すことができます。
クラス名(パラメータリスト):this(パラメータリスト){...}こうすると、このコンストラクタが実行される前に、thisパラメータリストと一致するコンストラクタが呼び出されます。コンストラクタが多数オーバーロードされていて、似たような処理をするときには便利かもしれません。
// this02.cs using System; class MyClass { int x, y, z; public MyClass() { Console.WriteLine("引数なしコンストラクタが呼ばれました"); x = 1; y = 1; z = 1; } public MyClass(int a) : this() { x = a; } public MyClass(int a, int b) : this() { x = a; y = b; } public MyClass(int a, int b, int c) { x = a; y = b; z = c; } public void show() { Console.WriteLine("x = {0}, y = {1}, z = {2}", x, y, z); } } class this02 { public static void Main() { string strLine = "-------------------"; MyClass mc1 = new MyClass(); mc1.show(); Console.WriteLine(strLine); MyClass mc2 = new MyClass(5); mc2.show(); Console.WriteLine(strLine); MyClass mc3 = new MyClass(10, 20); mc3.show(); Console.WriteLine(strLine); MyClass mc4 = new MyClass(100, 200, 300); mc4.show(); } }MyClassクラスにはx, y, zというフィールドがあります。このフィールドのデフォルトの値を1にしたいとします。また、xのみ、x,yのみ、x,y,zのすべてをユーザーの指定した値に初期化もできるようにしたいとします。
コンストラクタは、4種類のオーバーロードバージョンを用意しました。
引数なしバージョンでは、x, y, zの値を全部1で初期化しています。
さて、引数を1つだけ持つバージョンでは MyClass(int a) : this()として、まず引数なしバージョンを呼んでx,y,zの値を全部1にしています。その後xの値をユーザーが指定したaに設定しています。
同様のことを引数2個バージョンでも行っています。引数3個バージョンでは、意味がないのでthis呼び出しを行っていません。
では、実行結果を見てみましょう。
自分で値を設定していないフィールドはきちんと1になっていますね。
Update 09/Sep/2006 By Y.Kumei