p.160 メソッドを定義しよう
・Mainメソッドのような処理(振る舞い)の記述を、実行用ではないクラスにも記述できる
・メソッドは0個以上の情報を得て、なにか処理を行い、0または1個の情報を返すことができる仕掛け
・例: Addメソッドに1と2を渡すと、加算処理が動作して、3を返す
・メソッドの定義書式: アクセス修飾子 戻り値型 メソッド名(引数型 引数名, …){処理内容}
・アクセス修飾子:メソッドをクラスの外から呼び出す場合はpublicを指定(よって、Mainメソッドはpublic)
何も指定しないか、privateを指定すると、内部用になる(クラス内の別のメソッドからは利用可能)
・戻り値型(復帰型)は返す情報のデータ型を記述する。なお、ない場合は voidを指定する(よって、Mainメソッドは基本的にvoid)
・引数:メソッドに渡す情報で、0個以上いくつでも記述でき「データ型 引数名」をカンマつなぎする
・なお、0個の場合はカッコのみ記述する(よって、MainメソッドはMain()が基本)
・処理内容では、戻り値型が指定してある時は「return 値や式;」が必須になり、分岐などを含むときは、どの分岐になっても必ずreturnが
実行される必要がある。
・外部からメソッドを実行するには、インスタンス変数と同様に「オブジェクト名.メソッド名(…)」とする
・例:
class Monster { //クラスの定義
public int hp; //インスタンス変数の定義
public void showhp() { Console.WriteLine("HPは{0}", hp); } //メソッドの定義
}
:
class Game { //実行用クラス
public static void Main() { //実行用の特別なメソッド
Monster slalin = new Monster(); //Monsterオブジェクトを生成してスラリンとする
slalin.hp = 10; //スラリンのインスタンス変数hpに代入
slalin.showhp(); //スラリンのメソッドshowhp()を実行
}
}
・なお、returnの直後は(if-else構文等の場合を除き)実行されないので何かを記述するとエラーになる
アレンジ演習:p.161 method01.cs
・2つのint型の引数を受け取り、差をint型で返すSubメソッドを追記しよう ・Main()から、Subメソッドを呼び出して動作を確認しよう ・なお、ローカル変数を経由しないことで、シンプルに記述すること
作成例
//アレンジ演習:p.161 method01.cs
using System;
class MyClass //クラスの定義
{
public int Add(int x, int y) //int型の2引数を受け取り、int型を返すAddメソッドの定義
{
int z; //ローカル変数(メソッドの中で宣言され、メソッド内のみ有効な作業用の変数)
z = x + y; //2引数の和を求めてローカル変数zに代入
return z; //ローカル変数z経由で和を返す
}
public int Sub(int x, int y) { //【以下追加】int型の2引数を受け取り、int型を返すSubメソッドの定義
return (x > y) ? x - y : y - x; //xとyで大きいほうから小さいほうを引いた差を返す
}
}
class method01 //実行用クラス
{
public static void Main() //実行用の特別なメソッド
{
MyClass a = new MyClass(); //MyClassオブジェクトを生成してaとする
int sum; //合計用のローカル変数
sum = a.Add(100, 200); //100と200を引数としてオブジェクトaのAddメソッドに渡し、戻り値を代入
Console.WriteLine("sum = {0}", sum); //戻り値として和を代入されているローカル変数の値を表示
Console.WriteLine("sub = {0}", a.Sub(100, 200)); //【追加】直接メソッドを呼び100と200の差を表示
}
}
p.163 メソッドを定義しよう(インスタンスメソッド)
・method01.csのAdd(int,int)メソッドなどは、インスタンスに含まれて生成されるので、インスタンスメソッドともいう ・ちなみに、Main()メソッドはインスタンスに含まれない特殊なメソッド(p.202「静的メソッド」に該当する) ・インスタンスメソッドは同じインスタンスに属するインスタンス変数の値を無条件に(変数名だけで)得ることができる ・例:p.163 bmiclassにおける、BMIクラスのインスタンス変数blmを、インスタンスメソッドCalcで用いている ・なお、インスタンス変数blmのように、インスタンスメソッドからのみ利用される変数(外部からアクセスされない変数)は、 アクセス修飾子を「private」にして保護すると良い
アレンジ演習:p.163 bmiclass.cs
・身長、体重に0以下の値が入力されたら、先に進まずに、再入力させるようにしよう
作成例
//アレンジ演習:p.163 bmiclass.cs
using System;
class BMI //クラスの定義
{
private double blm; //身長(m単位)、インスタンス変数でprivate(内部用)
public double Calc(double bl, double bw) //double型の2引数を受け取り、double型を返すメソッドの定義
{
blm = bl / 100.0; //cm単位である引数blを100で割ってm単位にしてインスタンス変数に保持
return bw / Math.Pow(blm, 2.0); //BMIを算出して返す
}
}
class bmiclass
{
public static void Main()
{
string strBl, strBw; //入力用身長、体重
double blcm, bwkg; //実数返還後の身長、体重
do { //【追加】
Console.Write("身長(cm)---");
strBl = Console.ReadLine();
blcm = Double.Parse(strBl); //文字列である画面入力を実数化
} while (blcm <= 0); //【追加】
do { //【追加】
Console.Write("体重(kg)---");
strBw = Console.ReadLine();
bwkg = Double.Parse(strBw); //文字列である画面入力を実数化
} while (bwkg <= 0); //【追加】
BMI bmi = new BMI(); //BMIクラスのインスタンスを生成
Console.WriteLine("BMIは{0:#.##}です", bmi.Calc(blcm, bwkg)); //オブジェクト名経由で値を受渡す
}
}
p.164 メソッドを定義しよう(戻り値のないメソッド、引数のないメソッド)
・戻り値のないメソッドには「void」を指定する ・中で「return 値や式」を実行することはできないが、即時にメソッドの動作を打ち切って、呼び出し元に戻る「return;」は利用可能 ・また、複数記述しても良く、分岐によりreturnが実行されたない経路が有っても良い ・ただし、p.165 noreturnvalue.csにおける5つの「return;」はどれも次に実行すべき文がないので無意味で冗長。 ・引数のないメソッドでは、定義時と呼び出し時に「メソッド名()」とし「()」は省略不可。 ※ C/C++のように「(void)」とすると文法エラーになる
アレンジ演習:p.165 noreturnvalue.cs
・5つの「return;」を削除しても動作が変わらないことを確認しよう
提出:アレンジ演習:p.165 noreturnvalue.cs