戻り値

メソッドは呼び出し元のコードにデータを返すことができ、戻り値は呼び出し式の箇所にそのまま置き換わります。

データを返す必要がある場合、メソッド名の前に戻り値の型を宣言しなければなりません。戻り値が存在しない場合はvoidと記述します。

戻り値のないメソッドでもreturnは利用可能です。ただし「return 値;」とは書かず、単に「return;」だけを記述します。これは実行を中断する意味で、以降のコードは実行されず、呼び出し元へ処理が戻ります。

    int Add(int a, int b)  // int型の値を返す
    {
        return a + b;
    }Code language: JavaScript (javascript)
    void SayHi() // 戻り値なし
    {
        Console.WriteLine("hello welcome to foxdevelop.com");
    }Code language: JavaScript (javascript)

1、戻り値を持つメソッドには必ず return 式; を使用します。式の実行結果の型は、宣言した戻り値の型と一致している必要があります;

    int Add(int a, int b)
    {
        return 1.2;  // エラー。1.2はdouble型であり、intへ暗黙的に変換できないため型不一致でエラーとなる
    }Code language: JavaScript (javascript)

上記コードはdoubleの値を返そうとしています。リテラルの1.2は既定でdouble、すなわち浮動小数点数(小数)となります。コンパイラは小数を整数に自動変換できないためエラーが発生します。

逆のケースを見てみましょう

    double Add2()
    {
        return 10;  // 10はint型だがdoubleへ暗黙変換可能。型が適合するためエラーなし
    }Code language: JavaScript (javascript)

こちらはエラーになりません。10は整数リテラルですがdoubleへ暗黙的に変換可能なため型が適合します。単純に型名だけ比較せず、暗黙変換の可否を確認する必要があります。

暗黙的変換とは、開発者が変換コードを記述せず、コンパイラ側で自動的に型変換を行う仕組みのことです。対照的に開発者が明示的に記述する変換は明示的変換と呼びます。

型変換については後の章で学習します。

2、戻り値を持つメソッドでは、すべての実行経路で最終的にreturnが実行される必要があります。returnに到達しない分岐が存在してはいけません。

上のメソッドはAddの前にintと宣言しintを返すルールですが、メソッド本体にreturn文が一つもない場合、こちらもエラーになります。

この記述方法もエラーとなります。returnはifの条件が成立したときだけ実行され、a >= bとなる場合returnが実行されない経路が生まれるためです。

elseを追加したとしても、else内部にreturnがなければ同じ問題が発生します。returnに到達しない分岐が残るからです。このルールは他の制御構文でも同様で、すべての実行経路を適切に処理しなければなりません。

回避策が一つ存在します。メソッド末尾にreturnを追加して保険とする方法です。例は以下の通り

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

        }
        return -1; // 前の分岐に関わらずここまで実行されたら値を返す
        // -1が保険用の戻り値となる。
    }Code language: C# (cs)

戻り値には基本型(int、stringなど)、独自クラス、コレクションといったすべてのデータ型を利用可能;

returnが実行されると現在のメソッドは即時終了し、後続のコードは実行されません;

戻り値を持つメソッドの呼び出しは、式へ埋め込んだり出力・代入処理に直接記述可能です。

戻り値

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です