1. はじめに
想像してみて:電話(もしくはアプリ、今は21世紀だしね)でピザを注文する。オペレーターに注文内容を伝えると、オペレーターは結果としてピザを返してくれる!もしオペレーターが無言だったら…お腹すいたままだし、幸せも来ないよね。
関数も同じで、時には何かアクションを実行するだけだけど、よく「何か役立つもの」を返してほしい時がある。その結果は入力によって毎回違うこともある!例えば:
- 関数が2つの数字の合計を計算して結果を返す。
- 関数が人の年齢を受け取ってカテゴリ("子供", "大人", "年金受給者")を返す。
- 関数がユーザー名で素敵な挨拶文を作る。
戻り値は、関数が自分の処理結果を「外に渡す」方法だよ。
2. 戻り値ありメソッドのシグネチャ
前回の講義でこんなテンプレートを見たよね:
void PrintHello()
{
Console.WriteLine("こんにちは!");
}
void型は、関数が何も返さないことを意味する(voidは「空っぽ」、値がないってこと)。
じゃあ、何かを返す関数はどう書くのか見てみよう:
int Add(int a, int b)
{
// 関数の本体
}
ここでintは関数名の前に書いてあって、これは戻り値のデータ型だよ。もし関数が文字列を返すならstring、小数ならdouble、みたいな感じ。
関数宣言のシンタックスはこうなる:
<戻り値の型> メソッド名(<パラメータ>)
{
// 関数の本体
}
いろんなシグネチャ例:
| シグネチャ | 何を返すか |
|---|---|
|
整数 |
|
文字列 |
|
小数 |
|
論理値 |
3. return演算子:関数から結果を返す方法
ちゃんと動かすには、型を指定するだけじゃダメで、関数に「結果を上に返す」ことを教えなきゃいけない。そのために使うのがreturn演算子(return)。これで「はい、この値を返すよ」って伝えて、その瞬間に関数の実行が終わる(この時点で「外」に出るイメージ)。
型 メソッド名(...)
{
// なんか計算
return 値;
}
例:
int Add(int a, int b)
{
int sum = a + b;
return sum; // 計算結果を返す
}
大事なルール: returnで返す値の型は、メソッドのシグネチャで指定した型と完全に一致(もしくは互換性あり)じゃないとダメ。
4. 例:何かを返すメソッドを書いてみよう
さっそく例で確認しよう!よくあるパターンをいくつか見てみるね。
例1:2つの数字を足す
int Add(int a, int b)
{
return a + b;
}
// 使い方:
int result = Add(10, 20);
Console.WriteLine("合計: " + result); // 出力: 合計: 30
例2:個別の挨拶
string CreateGreeting(string name)
{
return "こんにちは、" + name + "!";
}
// 使い方:
string greeting = CreateGreeting("アンナ");
Console.WriteLine(greeting); // 出力: こんにちは、アンナ!
例3:成人かどうかチェック
bool IsAdult(int age)
{
return age >= 18;
}
if (IsAdult(21))
{
Console.WriteLine("入場OK。");
}
else
{
Console.WriteLine("ごめん、大人だけだよ。");
}
// 出力: 入場OK。
例4:戻り値を式で使う
Console.WriteLine("2倍: " + MultiplyByTwo(7));
int MultiplyByTwo(int n)
{
return n * 2;
}
5. 戻り値の型:バリエーションと特徴
C#では、関数は「型」なら何でも返せる(数字や文字列だけじゃないよ)。例えば:
- 整数型: int, long, short — シンプルだね。
- 小数型: double, float, decimal。
- 文字列型: string。
- ブール型: bool。
- 配列: int[], string[]など。
- 参照型: 自作クラスのオブジェクトなど。
- void: 何も返さない特別なケース。
なぜ戻り値の型がそんなに大事なの?
コンパイラは「約束したものをちゃんと返してるか」めっちゃ厳しくチェックする。intを返すって言ってるのに文字列や何も返さなかったらエラー。まるで厳しい上司みたい。
エラー例:
int GetNumber()
{
return "42"; // エラー!intが期待されてるのにstringを返してる。
}
6. 値なしreturn演算子:voidメソッドの場合
ちなみに、戻り値あり(例えばintやstring)のメソッドでは、returnには必ず返したい値をセットしなきゃダメ。
でも!関数がvoid型なら、returnを値なしで使ってもOK。これで即座に関数の実行を終わらせられる。
void PrintNumbers(int n)
{
if (n <= 0)
{
Console.WriteLine("数字はマイナスじゃダメだよ!");
return; // 何も返さずに関数から抜ける
}
for (int i = 1; i <= n; i++)
{
Console.WriteLine(i);
}
}
条件によって関数の実行を中断したいけど、何も返す必要がない時に便利だよ。
7. returnでよくあるミス
ああ、初心者プログラマーがreturnで頭を抱えること、めっちゃ多いんだよね!
問題1: 返すべき関数なのにreturnがない
int GetValue(bool flag)
{
if (flag)
return 1;
// あれ?flag == falseの時は?
}
// エラー: すべてのコードパスでreturnが必要!
解決法: どんな場合でもreturnが実行されるようにしよう!例えば:
int GetValue(bool flag)
{
if (flag)
return 1;
else
return 0;
}
問題2: 戻り値の型が合ってない
double GetMagicNumber()
{
return 42; // 実はOK(intはdoubleに暗黙変換できる)
// でももしintを返す関数でstringを返したらエラー!
}
ルール: 型の互換性に注意しよう。迷ったら明示的に型変換してもいい:
return (double)42;
問題3: 早すぎるreturn
returnが実行された瞬間、メソッドの処理は即終了。それ以降のコードは絶対に実行されない!
int GetNumber()
{
return 5;
Console.WriteLine("この行は絶対に実行されない"); // コンパイラも怒る!
}
問題4: voidメソッドで値を返そうとする(禁止!)
void PrintSomething()
{
return 1; // voidメソッドで値を返すのはダメ!
}
GO TO FULL VERSION