〖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));

53int型なので、整数用のAddが使われます。

public static int Add(int a, int b)

次に、小数を渡します。

Console.WriteLine(Calc.Add(2.5, 1.5));

2.51.5double型なので、小数用の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.0double型であることです。

答えはdouble版です。2つ目の2doubleへ変換できるため、計算結果は7になります。

最初は、整数版には整数、小数版には小数を渡すところから慣れていけば十分です。


⑬ まとめ

今回のポイントを振り返りましょう。

  • 同じ名前で、パラメーターの型や数が異なるメソッドを作ることをオーバーロードという
  • C#は、渡された引数の型や数から使うメソッドを選ぶ
  • 戻り値の型だけを変えてもオーバーロードにはならない
  • パラメーターに既定値を付けると、その引数を省略できる
  • 省略可能なパラメーターは、必須のパラメーターより後ろに書く
  • オーバーロードと省略可能なパラメーターは別の仕組み

これで、元のCalc.Addに含まれていた「引数と戻り値」「static」「オーバーロード」「省略可能なパラメーター」を、順番に確認できました。

シリーズ最初の記事:Addメソッドの基本|引数・戻り値・呼び出し

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

広告