【C#】関数(メソッド)
変数の解説と被る部分が多いので、変数について何も知らない人は先にこちらをチェック。
関数とは
別名メソッド。
メソッドが担う役割は2つある。
- まとまった処理を実行する。
- 処理の結果に応じて呼び出し元に値を返す。
2つとも大事なので覚えておいて欲しい。
定義と用法
定義方法
1. アクセス修飾子
2. 戻り値のデータ型
3. メソッド名
4. ()の中に引数のデータ型と名前
5. {}の中に具体的な処理
の順に書く。
引数については後で詳しく書くが、引数は複数あってもよいし無くてもよい。
// アクセス修飾子 戻り値の型 メソッド名 // ()の中に 引数の型 引数名 // {}の中に 具体的な処理 private int SampleMethod(int num) { // 具体的な処理 }
用法
引数の値は適当。
// 戻り値が不要な場合 SampleMethod(10); // 戻り値が必要な場合 valueに戻り値が入る int value = SampleMethod(20);
難しいので分かりやすいところから説明していく。
アクセス修飾子 ☆
メソッドの呼び出しができる範囲を決定するもの。
privateにすると、そのクラス内でしかメソッドを呼び出すことができない。publicにすると、外のクラスからでもメソッドを呼び出すことができる。
省略して書くと、そのメソッドは暗黙的にprivateとして扱われる。
// privateとして扱われる void Foo() { }
メソッド名
メソッドの名前。自由に名前を付けていいが、他で既に使われている名前だとエラーが出たりする。
分かりやすい名前にしないと、後から見たときにわけが分からなくなるので注意。
メソッドの名前は全ての単語の先頭を大文字で書くのが主流。この命名規則をパスカルケースという。
// パスカルケース private void FinalFlashBigBangAttack() { }
具体的な処理
メソッドの中身。メソッド名に合った処理を書いてあげよう。
前述した「まとまった処理を実行する」という役割を果たす。
private void AppearCatLog() { Debug.Log("ねこ"); // 具体的な処理 }
引数
引数とは
メソッドを呼び出すときに、メソッドに渡すことができる値を引数という。メソッドの実行に必要な情報を与えることが目的。
前述したが、引数は複数あってもよいし無くてもよい。
引数の名前は先頭の単語だけ全て小文字にして、あとの単語の頭文字を大文字で書くのが主流。この命名規則をローワーキャメルケースという。
// ローワーキャメルケース private void Bar(int argValue) { }
引数の活用例
メソッドの定義
/// <summary> /// 引数に与えられた文字列をログとして出力する /// </summary> /// <param name="message">ログに出力する文字列</param> private void AppearLog(string message) { Debug.Log(message); // messageにはメソッドを呼び出す側が与えた値が入る。 }
メソッドの呼び出し
引数に任意の値を入れてメソッドを呼ぶ。このメソッドの場合、引数で与えられた文字列をログとして出力する。
AppearLog("ねこ");
戻り値
戻り値とは
メソッドの呼び出し元に返す値のことを戻り値という。返り値ともいう。
前述した「処理の結果に応じて呼び出し元に値を返す」という役割を果たす。
戻り値があるメソッドは必ずreturn文で値を返さなければならない。また、メソッド内にif文などで条件分岐を作った場合、どの条件分岐を辿ったとしても戻り値が存在するようにしなければならない。
戻り値の活用例
メソッドの定義
メソッドの最後に「return 値」と書くことで、メソッドの実行を終了して値を返す。
/// <summary> /// 引数で与えられた2つの値を足す /// </summary> /// <param name="a">前項</param> /// <param name="b">後項</param> /// <returns>計算結果</returns> private int Addition(int a, int b) { int value = a + b; // int型のローカル変数を定義 return value; // returnで値を返す }
メソッドの呼び出し
戻り値を取得して、計算結果をログとして出力する。
int value = Addition(5, 3); // valueに5 + 3の計算結果が入る Debug.Log(value); // ログに8が出力される
voidメソッド
voidとは「何もない」ことを意味するデータ型。戻り値にvoidを設定すると、戻り値がないvoidメソッドを作ることができる。voidメソッドはreturn文が不要。
戻り値なんて要らないけど、処理の実行はしたい。そんなときにはvoidメソッドを作る。
// ログを出力するだけのメソッド // 戻り値がないのでreturn文が不要 private void AppearLog(string message) { Debug.Log(message); } // メソッド呼び出し AppearLog(“ねこ”);
// 足し算をして、さらに計算結果を戻り値として返すメソッド // 戻り値があるのでreturn文が必要 private int Addition(int a, int b) { int value = a + b; return value; // returnで値を返す } // -----メソッド呼び出し----- // // 戻り値を取得する int value = Addition(5, 3); // 戻り値を取得しなくてもよい Addition(5, 3);
正味、voidメソッドが1番使う機会多そう。でも戻り値があるメソッドも分かっていると、よりきれいなコードを書けると思う。
実践 ☆
以下のコードはキャラクターのclass実装例。OnDamageメソッドが引数と戻り値のある難しいメソッドになっている。
こんな感じにメソッドを作るよ、という例です。
public class Character { /// <summary> /// ヒットポイント /// </summary> private int m_Hp; /// <summary> /// ダメージを受けるメソッド /// </summary> /// <param name="atk">相手の攻撃力</param> /// <returns>被ダメージ後の残りHp</returns> public int OnDamage(int atk) { // Hpをatkだけ減らす m_Hp -= atk; // 被ダメージ後のHpの値を返す return m_Hp; } }
OnDamageメソッドの呼び出し方法例。
// 戻り値が不要な場合 OnDamage(10); // 戻り値が必要な場合 remainingHpに被ダメ後の残りHpが入る int remainingHp = OnDamage(10);