C#のメソッドは「行って、仕事をして、戻る」で理解しよう

広告

C#で初めてメソッドを学ぶとき、多くの人がつまずくのは、voidreturn の書き方だけではありません。

本当に難しいのは、プログラムが今どこを実行していて、次にどこへ移るのかを頭の中で思い浮かべることです。

そこで今回は、ブラウザの画面遷移をアニメーション教材のように使い、メソッドの実行の流れを理解してみます。

HTMLのコードを読む必要はありません。見るのは、画面が「移動する」「材料を渡す」「結果を持って戻る」という3つの動きだけです。

この記事の画面遷移は、メソッドの動きを理解するためのたとえです。実際のWebページとC#のメソッドが、同じ仕組みで動いているわけではありません。

まずはメソッドを「別の作業場所」と考える

メソッドを呼び出すと、プログラムの実行位置は呼び出し元からメソッドへ移ります。

メソッド内の処理が終わると、実行位置は呼び出し元へ戻り、その次の行から処理が続きます。

最初は、次のように考えてみましょう。

  • メソッドを呼び出す:別の作業場所へ行く

  • 引数を渡す:作業に必要な材料を持って行く

  • return する:完成した結果を持ち帰る

この3つが見えるようになると、メソッドのコードを追いやすくなります。

呼び出し元からメソッド内へ引数Aを渡し、戻り値の診断結果を持ち帰る流れ
引数を渡してメソッドを呼び出し、戻り値を受け取るまでの流れ

1.引数なし・戻り値なし:手ぶらで行って戻る

ブラウザ上のリンクを押すと、別の画面へ移動します。移動先ではメッセージを表示し、処理が終わります。

この動きは、引数も戻り値もない単純なメソッドのイメージに使えます。

static void Jump()
{
    Console.WriteLine("別の作業場所に来ました");
}

呼び出す側は、次のように書きます。

Jump();

Jump(); が実行されると Jump メソッドへ移動し、メッセージを表示します。処理が終わると、呼び出した場所へ戻ります。

受講生には、次のように伝えるとよいでしょう。

手ぶらで作業場所へ行き、そこで仕事をして戻ってきます。

2.引数あり・戻り値なし:材料を渡して仕事をしてもらう

次は、ブラウザで血液型を選び、ボタンを押す場面を考えます。

選んだ「A型」という情報が次の画面へ渡され、その情報を使って診断結果が表示されます。

static void ShowFortune(string blood)
{
    Console.WriteLine($"{blood}型のあなたは……几帳面タイプ!");
}

呼び出すときは、丸括弧の中に渡したい値を書きます。

ShowFortune("A");

ここでは、"A" が引数です。呼び出された側では、blood という仮引数で受け取ります。

  • "A":実際に渡す値(引数)

  • blood:渡された値を受け取る変数(仮引数)

このメソッドは、受け取った材料を使って画面に表示します。しかし、呼び出し元へ値は返しません。そのため戻り値の型は void です。

「A」という荷物を渡しました。向こうでは、その荷物を使って表示してから戻ってきます。

3.引数あり・戻り値あり:材料を渡して結果を持ち帰る

今度は「A型」という材料を渡し、作成された診断結果を呼び出し元で受け取ります。

static string GetFortune(string blood)
{
    string result = $"{blood}型のあなたは……几帳面タイプ!";
    return result;
}

呼び出し元では、戻ってきた文字列を変数に代入します。

string myResult = GetFortune("A");
Console.WriteLine(myResult);

処理の流れは次のとおりです。

  1. GetFortune("A") を呼び出す
  2. "A"blood に渡される
  3. メソッド内で診断結果を作る
  4. return result; で文字列を返す
  5. 返された文字列が myResult に入る
  6. 呼び出し元で myResult を表示する

ここで大切なのは、GetFortune("A") 自体が、最終的には返された文字列に置き換わるように考えることです。

string myResult = GetFortune("A");

実行後のイメージは、次のようになります。

string myResult = "A型のあなたは……几帳面タイプ!";

「A」という材料を渡し、向こうで作った診断結果を持って帰って、myResult で受け取ります。

まずは、ブラウザ上でメソッドの動きを体験してみましょう。

3つのメソッドを1つのプログラムで確認しよう

Visual Studioで試す場合は、次のコードを使えます。

namespace MethodFlowSample
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Jump();

            ShowFortune("A");

            string myResult = GetFortune("A");
            Console.WriteLine(myResult);
        }

        static void Jump()
        {
            Console.WriteLine("別の作業場所に来ました");
        }

        static void ShowFortune(string blood)
        {
            Console.WriteLine($"{blood}型のあなたは……几帳面タイプ!");
        }

        static string GetFortune(string blood)
        {
            string result = $"{blood}型のあなたは……几帳面タイプ!";
            return result;
        }
    }
}

コードを上から眺めるだけでは、実行の流れをつかみにくいかもしれません。そこで、Visual Studioのデバッガを使います。

F11キーでメソッドの中へ入ってみよう

Main メソッド内の Jump(); の行にブレークポイントを置き、デバッグを開始します。

停止したら、F11キーの「ステップ イン」を1回ずつ押してください。

Jump(); から Jump メソッドの中へ黄色い矢印が移動します。これは、ブラウザでリンク先の画面へ移動したときのイメージです。

メソッドの処理が終わると、黄色い矢印は Main メソッドへ戻ります。そして、呼び出し行の次の行から実行が続きます。

次に、GetFortune("A") でも同じ動きを確認します。

  1. 呼び出し元から GetFortune の中へ入る
  2. blood"A" が入っていることを確認する
  3. result に診断結果が入る
  4. return result; で結果を返す
  5. 呼び出し元へ戻り、myResult に結果が入る

ウォッチウィンドウやマウスポインターで変数の中身も確認すると、「材料を渡して、成果物を受け取る」という動きがさらに分かりやすくなります。

F10とF11の違い

デバッグ中は、F10とF11を使い分けます。

  • F10(ステップ オーバー):メソッドを1つの処理として実行し、中には入らない

  • F11(ステップ イン):呼び出したメソッドの中へ入る

メソッドの実行順序を学ぶときは、まずF11を使いましょう。黄色い矢印が「呼び出し元→メソッド内→呼び出し元」と動く様子を観察できます。

ブラウザのたとえで押さえる3つの動き

メソッドの種類 ブラウザでのイメージ C#で注目する部分
引数なし・戻り値なし 手ぶらで移動し、仕事をして戻る void Jump()
引数あり・戻り値なし 材料を渡し、向こうで使う void ShowFortune(string blood)
引数あり・戻り値あり 材料を渡し、結果を持ち帰る string GetFortune(string blood)return

最初から文法用語をすべて暗記する必要はありません。

まずは、次の短い言葉で実行の流れをつかみましょう。

  • 呼び出す:行く

  • 引数:渡す材料

  • 戻り値:持ち帰る結果

  • return:結果を返して元へ戻る

まとめ

メソッドを理解する第一歩は、コードの形を暗記することではなく、実行の流れを頭の中で再生できるようになることです。

ブラウザの画面遷移で「行く・渡す・持ち帰る」を体験した直後に、Visual StudioのF11キーで同じ流れを追うと、メソッド呼び出しが目に見える動きとしてつながります。

メソッドの中へ行き、仕事を終えて、呼び出した場所へ戻る。

まずはこの基本の往復を、黄色い矢印を追いながら確認してみてください。

訪問数 6 回, 今日の訪問数 6回

広告