前回は「メソッド(処理に名前をつけてまとめる)」をやりました。

今回は、メソッドをぐっと便利にする2つのしくみ。引数(ひきすう)戻り値(もどりち)です。

引数はメソッドに「渡す」もの、戻り値はメソッドから「返ってくる」ものです。

前回のメソッドの、もの足りないところ

前回のメソッドは、いつも同じことをするだけでした。

void Greet()
{
    Console.WriteLine("ようこそ");
}

これだと、いつも「ようこそ」としか言えません。でも、「山田さん、ようこそ」のように、相手によって変えられたら便利ですよね。

そこで使うのが「引数」です。メソッドに情報を渡して、その内容によって動きを変えられます。

料理でいうなら、下ごしらえメソッドに「この食材を」と渡すイメージ。渡す食材によって、下ごしらえの中身が変わります。

引数 ── メソッドに渡す

名前を渡せるように、メソッドを書き換えてみます。

void Greet(string name)
{
    Console.WriteLine(name + "さん、ようこそ");
}

カッコの中に string name が増えました。これが引数です。「呼び出すときに、文字列をひとつ渡してね。それを name で受け取ります」という意味です。

呼び出すときは、カッコの中に渡す値を書きます。

Greet("山田");   // 山田さん、ようこそ
Greet("田中");   // 田中さん、ようこそ

渡した名前によって、表示が変わりました。同じメソッドなのに、渡す値しだいで結果が変わる。これが引数の力です。

戻り値 ── メソッドから返ってくる

もうひとつが「戻り値」です。メソッドに何かを計算させて、その結果を受け取るしくみです。

たとえば「2つの数を足して、結果を返す」メソッド。

int Add(int a, int b)
{
    return a + b;
}

前回までと、2つ違う点があります。

  • 先頭が void ではなく int … 「整数を返しますよ」という意味
  • return a + b; … 計算結果を 返す(これが戻り値)

return(リターン)は、「この値を、呼び出し元に返す」という命令です。

呼び出すと、結果を受け取れます。

int answer = Add(3, 5);
Console.WriteLine(answer);   // 8

Add(3, 5) が 8 を返し、それが answer の箱に入りました。

実はこれ、今まで使ってきた int.Parse()(第5回)と同じしくみです。あれも「文字列を渡すと、整数を返してくれる」メソッドでした。

void と、型を返すメソッド

ここで、void の正体がはっきりします。

  • void … 結果を返さないメソッド(表示するだけ、など)
  • intstring … その型の値を返すメソッド

前回の Greet は、表示するだけで何も返さないので void
今回の Add は、計算結果(整数)を返すので int

「このメソッドは、何か結果を返すのか?返すなら何の型か?」。先頭の部分が、それを表しているのです。

組み合わせると

引数と戻り値を組み合わせると、メソッドは「情報を受け取って、処理して、結果を返す」という、ひとつの部品になります。

int Add(int a, int b)   // a と b を受け取り(引数)
{
    return a + b;       // 足した結果を返す(戻り値)
}

これはまさに、第3回や第5回で出てきた「入力 → 処理 → 出力」の形です。引数で入力を受け取り、戻り値で出力を返す。メソッドは、その小さな単位なんです。

つまずきポイント

初心者がよく間違えるのが、戻り値を受け取り忘れることです。

Add(3, 5);                    // 計算したけど、結果をどこにも入れていない
Console.WriteLine(answer);    // answer なんて無い!エラー

Add(3, 5) は8を返しますが、それを箱に入れないと、結果は消えてしまいます。

int answer = Add(3, 5);       // 結果を answer に受け取る(正しい)
Console.WriteLine(answer);

return で返した値は、呼び出し側で受け取る」。返すだけでなく、受け取るのもセット。そう覚えておきましょう。

まとめ

引数は渡すもの、戻り値は返ってくるもの。

int Add(int a, int b)   // 引数:a, b を受け取る
{
    return a + b;       // 戻り値:結果を返す
}

int answer = Add(3, 5); // 渡して、受け取る
  • 引数 … メソッドに情報を渡す(カッコの中)
  • 戻り値 … メソッドから結果を返す(return
  • void は返さない、型がついていれば返す
  • 返した値は、呼び出し側で受け取る

次回は、変数が「どこまで使えるか」という スコープ の話です。メソッドを理解した今だからこそ、すっきり分かります。