p.174 this
・自分自身を指す参照を与えるキーワードがthis ・クラス内で自分自身を指す参照を代入したり、操作に用いたい場合に利用できる
p.174 this01.cs
//p.174 this01.cs
using System;
class MyClass {
public MyClass m1, m2; //自分のクラスを型とする参照変数(インスタンス変数)
public void Test() { //インスタンスメソッド
m2 = this; //自分自身を指す参照を代入
}
public MyClass() { //コンストラクタ
m1 = this; //自分自身を指す参照を代入
}
}
class this01 {
public static void Main() {
MyClass mc = new MyClass(); //オブジェクトを生成しコンストラクタを呼ぶ(m1にthisが代入される)
mc.Test(); //m2にthisが代入される
if (mc.m1 == mc.m2) //インスタンス変数どうしを比較(どちらもthisが代入されているので等しい)
Console.WriteLine("m1とm2は同じです");
if (mc == mc.m1) //自分自身とインスタンス変数m1を比較(thisが代入されているので等しい)
Console.WriteLine("mcとm1は同じです");
if (mc == mc.m2) //自分自身とインスタンス変数m2を比較(thisが代入されているので等しい)
Console.WriteLine("mcとm2は同じです");
}
}
参考:thisの活用法
・thisが自分自身(自オブジェクト)を指すことを利用して、インスタンス変数を扱うメソッドの引数名を変数名と同じにできる
例:
class Monster {
int hp, mp;
void setHp(int hp) { this.hp = hp; } //「hp = hp」はエラーなのでこうすると良い
void setMp(int mp) { this.mp = mp; } //「mp = mp」はエラーなのでこうすると良い
}
p.176 既存のクラスを使ってみる
・すでに利用しているConsole.Writeや、Math.PIは特殊なクラスの利用例(静的メソッド/データメンバ) ・ここまで用いたインスタンス変数やインスタンスメソッドを持つ既存のクラスも多数ある ・その1つがArrayListクラスで、利用には「using System.Collections;」を指定すること。 ・ArrayListクラスは必要に応じてサイズが動的に拡大される配列を提供するもので、各種のメソッドが利用できる ・デフォルトコンストラクタ:空で、既定の初期量を備えた、ArrayList クラスの新しいインスタンスを初期化 ・add(object)メソッド:要素を末尾に格納する(どんな型でもOK) ・Countプロパティ:要素数を返す(プロパティは特殊なメソッド:p.207で後述) ・配列と同様に[n]で先頭から(先頭を0として)n番目の要素が得られる ・ただし、得られる要素はobject型なので、元の型にキャストして用いること
p.177 arraylist01.cs
//p.177 arraylist01.cs
using System;
using System.Collections;
class arraylist01 {
public static void Main() {
bool bEnd = false; //終了フラグをオフに
string strData; //入力用
double sum = 0.0; //合計
ArrayList al = new ArrayList(); //アレイリストを生成
while (true) { //無限ループ
Console.Write("データ(数値以外入力で終了)-- ");
strData = Console.ReadLine();
if (!Char.IsDigit(strData[0]) && strData[0] != '-') { //先頭文字が数字でも-でもない
bEnd = true; //終了フラグをオンに
} else { //実数変換が可能?(※チェックとしては不十分)
al.Add(double.Parse(strData)); //実数変換してアレイリストに格納
}
if (bEnd) { //終了フラグがオン?
break; //無限ループを抜ける
}
}
for (int i = 0; i < al.Count; i++) { //アレイリストの要素数だけ繰り返す
Console.WriteLine("Data[{0}] = {1}", i + 1, al[i]); //番号i+1と要素[i]の値を表示
sum += (double)al[i]; //要素[i]をdouble型に戻してから合計に足しこむ
}
int count = al.Count; //アレイリストの要素数を得る
double avr = sum / count; //合計を要素数で割って平均値を得る
Console.WriteLine("データ個数 = {0}", count); //要素数を個数として表示
Console.WriteLine("平均値 = {0}", avr); //計算済の平均値を表示
}
}
p.180 練習問題1 ヒント
・「インスタンス変数のみを持つクラス」とあるので、実行用のMainメソッドを持つクラスとは別に記述しよう ・「Mainメソッドからこのフィールドに数値を代入し」とあるので、public指定すること
作成例
// p.180 練習問題1
using System;
class MyInt {
public int x; //外部からアクセスできるインスタンス変数
}
class ex071 {
public static void Main() {
MyInt m = new MyInt(); //オブジェクトを生成
m.x = 10; //インスタンス変数に代入
Console.WriteLine("m.x = {0}", m.x); //インスタンス変数の値を表示
}
}
p.180 練習問題2 ヒント
・int型2値の和を得るメソッドの戻り値型はintに、double型2値の和を得るメソッドの戻り値型はdoubleにすると良い ・この2メソッドを同じ名前のメソッド(例:Add)にすると、オーバーロードになる ・「メソッドを持つクラス」とあるので、実行用のMainメソッドを持つクラスとは別に記述しよう ・「Mainメソッドからこれらのメソッドを利用」とあるので、2メソッドはpublic指定にすること
作成例
// p.180 練習問題2
using System;
class MyAdd {
public int add(int i1, int i2) { //外部からアクセスできるインスタンスメソッド①
return i1 + i2;
}
public double add(double i1, double i2) { //①をオーバーロードしているインスタンスメソッド②
return i1 + i2;
}
}
class ex072 {
public static void Main() {
MyAdd m = new MyAdd(); //オブジェクトを生成
Console.WriteLine("1 + 2 = {0}", m.add(1, 2)); //メソッド①を呼んで戻り値を表示
Console.WriteLine("1.1 + 2.2 = {0}", m.add(1.1, 2.2)); //メソッド②を呼んで戻り値を表示
}
}
提出:p.180 練習問題2