この章のテーマ §
メソッドの基礎を学びます。最低限のメソッドの宣言と利用と引数と戻り値について説明します。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, string型, int型, 複文
解説 §
メソッドとは、複数の文をひとまとめにして何回でも利用できるようにしたものです。
同じ処理が多いプログラムは、同じ処理をメソッドにまとめるとプログラムが簡潔になります。
メソッドには以下の特徴があります。
- たいていの場合名前がある (名前のない匿名メソッドというものもあるが別途扱う)
- 引数リストを追加することができ、特定の値をメソッドに渡せる (無くても可)
- 戻り値(返却値)を指定することができ、値をメソッドを呼び出した側に返せる (無くても可)
- 短縮表記ができる
メソッドを利用するためには、2つの智識が必要とされます。メソッドを宣言する方法と、宣言されたメソッドを呼び出す方法です。
メソッドを宣言するには、戻り値の型+名前+"("+引数リスト+")"という書式を使います。その後で実行する文を書きます。戻り値がないときは戻り値の型としてvoidを書きます。引数がない場合は単純に何も書かず引数リストを空にしておきます。メソッドが値を返す場合はreturn文の後に戻す値を示す式を書きます。短縮表記の場合はreturn不要で直接式を書きます。
通常表記の場合は、実行する文を波括弧{}でくくります。
短縮表記の場合は、=>のあとで実行する文を1つだけ書きます。
メソッドを呼び出すには、名前+名前+"("+引数リスト+")"+";"という書式を使います。もし、戻り値があるなら、メソッド呼び出し自体が値を持ちます。
罠の数々 §
- 引数を使うことで、メソッドの動作を変更できる。サンプルソースでは、helloTo("Joe");とhelloTo("Mike");はそれぞれHello, Joe!、Hello, Mike!という異なる結果を引き起こす
- メソッドから値を返すことができる。Console.WriteLine(calcAdd(1,2));は、calcAddメソッドの結果を受け取って表示している
- サンプルソースのメソッド宣言は、通常表記と短縮表記で同じ内容を記述している。比較してみよう。
- メソッドはクラス/構造体に含める場合と、他のメソッドに含める場合ではやや構文と機能が異なる。他のメソッドに含める場合はローカルメソッドと呼び、ここで説明しているのは厳密にはローカルメソッドである。ただしどちらでも引数などの基本は同じである。クラス/構造体を学ぶ際には、少しだけ思い出そう
参考リンク §
メソッド (C# プログラミング ガイド)
サンプルソース: methodBasic §
// メソッド呼び出し
hello();
helloTo("Joe");
helloTo("Mike");
Console.WriteLine(calcAdd(1,2));
helloShortForm();
helloToShortForm("Joe");
helloToShortForm("Mike");
Console.WriteLine(calcAddShortForm(1, 2));
// メソッド宣言 (通常表記)
void hello()
{
Console.WriteLine("Hello!");
}
void helloTo(string name)
{
Console.WriteLine($"Hello, {name}!");
}
int calcAdd(int x, int y)
{
return x + y;
}
// メソッド宣言(短縮表記)
void helloShortForm() => Console.WriteLine("Hello!");
void helloToShortForm(string name) => Console.WriteLine($"Hello, {name}!");
int calcAddShortForm(int x, int y) => x + y;
実行結果 §
Hello!
Hello, Joe!
Hello, Mike!
3
Hello!
Hello, Joe!
Hello, Mike!
3
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
sub(0);
void sub(int x)
{
sub(x + 1);
}
- subメソッドからsubメソッド自身は呼べない。コンパイルエラー
- subメソッドからsubメソッド自身を呼んでも良い。正常終了。
- subメソッドからsubメソッド自身を呼んでも良いが、無限に呼べるわけではない。実行時例外で止まる。
[[解答]]