〖C#入門〗メソッドのオーバーロードと省略可能な引数をAddで学ぼう
前回は、Addをstaticメソッドにして、Calc.Add(5, 3)と呼び出しました。
public static int Add(int a, int b)
{
return a + b;
}
今回は、Addを少し便利にする2つの仕組みを学びます。
- 同じ名前のメソッドを複数作る「オーバーロード」
- 一部の引数を省略できる「省略可能なパラメーター」
一度に混ぜず、1つずつ確認していきましょう。
→ 前の記事:staticメソッドとは?newなしでAddを呼び出してみよう
① 整数用のAddを振り返る
まずは、これまで使ってきた整数用のAddです。
public static int Add(int a, int b)
{
return a + b;
}
次のように呼び出せます。
int result = Calc.Add(5, 3);
Console.WriteLine(result);
実行結果は8です。
このAddが受け取れるのはint型の値です。
② 小数用のAddを追加する
次は、double型の小数を足せるようにします。
public static double Add(double a, double b)
{
return a + b;
}
Calcクラスには、同じ名前のAddが2つ並びます。
class Calc
{
public static int Add(int a, int b)
{
return a + b;
}
public static double Add(double a, double b)
{
return a + b;
}
}
同じクラスの中に、同じ名前でパラメーターの型や数が異なるメソッドを作ることをオーバーロードと呼びます。
③ C#が使うAddを選ぶ
整数を渡した場合を見てみましょう。
Console.WriteLine(Calc.Add(5, 3));
5と3はint型なので、整数用のAddが使われます。
public static int Add(int a, int b)
次に、小数を渡します。
Console.WriteLine(Calc.Add(2.5, 1.5));
2.5と1.5はdouble型なので、小数用のAddが使われます。
public static double Add(double a, double b)
実行結果は次のようになります。
8
4
C#は、渡された引数の型や数を見て、どのメソッドを呼び出すかを決めます。
④ 戻り値の型だけでは分けられない
オーバーロードでは、パラメーターの型や数を変える必要があります。
戻り値の型だけを変えた、次の2つは作れません。
public static int Add(int a, int b)
{
return a + b;
}
public static double Add(int a, int b) // エラー
{
return a + b;
}
呼び出す側は、どちらもCalc.Add(5, 3)になるため、C#が区別できないからです。
⑤ 省略可能なパラメーターを作る
ここからは、整数用のAddに別の機能を加えます。
public static int Add(int a, int b = 3)
{
return a + b;
}
b = 3に注目してください。
int b = 3
これは、bの引数が省略されたときに、既定値として3を使うという意味です。
このbを省略可能なパラメーターと呼びます。「オプション引数」や「デフォルト引数」と呼ばれることもありますが、この記事ではC#の用語に合わせて「省略可能なパラメーター」「既定値」と呼びます。
⑥ 引数を1つだけ渡してみる
bを省略できるようになったため、次の呼び出しができます。
Console.WriteLine(Calc.Add(5));
処理の流れは次のようになります。
aには5が入る
↓
bは省略されたので既定値の3が使われる
↓
5 + 3を計算する
↓
8が返る
実行結果は8です。
⑦ 2つ目の引数を渡した場合
引数を2つ渡すこともできます。
Console.WriteLine(Calc.Add(5, 2));
この場合、bには渡した値の2が入ります。既定値の3は使われません。
5 + 2 = 7
既定値は、引数が省略されたときだけ使われます。
⑧ 省略可能なパラメーターを書く位置
省略可能なパラメーターは、必須のパラメーターより後ろに書きます。
public static int Add(int a, int b = 3) // OK
次の順番にはできません。
public static int Add(int a = 3, int b) // エラー
まずは「省略できるものは後ろ」と覚えておきましょう。
⑨ 完成したコード
using System;
class Program
{
static void Main()
{
Console.WriteLine(Calc.Add(5));
Console.WriteLine(Calc.Add(5, 2));
Console.WriteLine(Calc.Add(2.5, 1.5));
}
}
class Calc
{
public static int Add(int a, int b = 3)
{
return a + b;
}
public static double Add(double a, double b)
{
return a + b;
}
}
実行結果は次のようになります。
8
7
4
3つの呼び出しを整理すると、次のようになります。
| 呼び出し | 使われるメソッド | 計算 |
|---|---|---|
Calc.Add(5) |
int版 |
5 + 3 |
Calc.Add(5, 2) |
int版 |
5 + 2 |
Calc.Add(2.5, 1.5) |
double版 |
2.5 + 1.5 |
⑩ 初学者が混乱しやすいポイント
なぜ同じAddが2つあってもよいの?
パラメーターの型が異なるため、C#が区別できます。
Add(int a, int b)
Add(double a, double b)
なぜ5だけで動くの?
bが省略可能なパラメーターで、既定値の3を持っているからです。
Add(int a, int b = 3)
オーバーロードと省略可能なパラメーターは同じもの?
同じものではありません。
- オーバーロード:同じ名前のメソッドを複数用意する仕組み
- 省略可能なパラメーター:呼び出すときに一部の引数を省略できる仕組み
今回は、1つのCalcクラスの中で両方を使っています。
⑪ 練習問題
① double版のAddを使って、3.2 + 1.8を計算してみましょう。
② 整数用のAddで、bを省略した場合の既定値を10に変えてみましょう。
③ int版とdouble版のSubメソッドを作ってみましょう。
⑫ 発展問題
次の呼び出しでは、どちらのAddが使われるでしょうか。
Console.WriteLine(Calc.Add(5.0, 2));
ヒントは、5.0がdouble型であることです。
答えはdouble版です。2つ目の2はdoubleへ変換できるため、計算結果は7になります。
最初は、整数版には整数、小数版には小数を渡すところから慣れていけば十分です。
⑬ まとめ
今回のポイントを振り返りましょう。
- 同じ名前で、パラメーターの型や数が異なるメソッドを作ることをオーバーロードという
- C#は、渡された引数の型や数から使うメソッドを選ぶ
- 戻り値の型だけを変えてもオーバーロードにはならない
- パラメーターに既定値を付けると、その引数を省略できる
- 省略可能なパラメーターは、必須のパラメーターより後ろに書く
- オーバーロードと省略可能なパラメーターは別の仕組み
これで、元のCalc.Addに含まれていた「引数と戻り値」「static」「オーバーロード」「省略可能なパラメーター」を、順番に確認できました。
→ シリーズ最初の記事:Addメソッドの基本|引数・戻り値・呼び出し





ディスカッション
コメント一覧
まだ、コメントがありません