C#はオブジェクト指向言語であり、その最も根底をサポートするのがメソッドです。つまり、メソッドを学ぶことは、オブジェクト指向への入り口でもあるわけです。
メソッドについて理解されていない人は「【C#】メソッドとは | メソッドを作成して使用する方法」を確認してもらえればと思います。今回の内容は「メソッドの引数にデフォルト値を設定する場合」を解説していきます。
引数にデフォルト値を設定する
では、引数にデフォルト値を持つ場合の記述方法について紹介していきます。メソッドに引数のデフォルト値を持つことを明記する場合は、メソッドを少しだけ修正することで可能となります。新規のコンソールアプリケーションを作成して、以下のソースコードを買いて実行してみてください。今回は分かるように1つのメソッドを2回呼ぶようにしてみます。
using System;
namespace App02
{
class Program
{
static void Main(string[] args)
{
//引数を指定して実行する
WriteMessage("Mr.Monday");
//引数なしで実行する
WriteMessage();
Console.ReadLine();
}
//引数に初期値「hoge」を持つメソッドを定義する
static private void WriteMessage(string name = "hoge")
{
Console.WriteLine("Hello, " + name + "!");
}
}
}
上記のコンソールアプリケーションを実行してみると、結果は以下のようになると思われます。
Hello, Mr.Monday!
Hello, hoge!
一つめの出力は「Hello, Mr.Monday!」となっており、これは引数を設定して「WriteMessage」メソッドを実行した場合の出力結果ですね。また、2つ目の出力結果である「Hello, hoge!」は、引数のデフォルト値でメソッドが実行されている証拠です。
デフォルト値を設定する意味
メソッドの引数にデフォルト値を設定するには、「型 引数名 = 値」と記述するだけで設定が可能となります。先ほどのサンプルにおける「string name = “hoge”」がまさにそうですね。
これはstring型の引数「name」に対して「hoge」という初期値を与えているにほかなりません。引数にデフォルト値を与える場合は、引数の型を持つ値を指定すればOKです。
メソッドが引数を持つ場合は、必ず引数を指定してメソッドを記述する必要がありました。それに対してメソッドがデフォルト値を持っている場合は、メソッド実行時に引数を指定する必要がありません。
先ほどのサンプルでは「WriteMessage(“Mr.Monday”);」と「WriteMessage();」を見ていただければわかるかと思います。例えば、何かしらの仕様で引数に値が入らない場合を想定しなくてはならない時なんかに活用できるかと思います。
もしくはメソッドを改変しなければならない時などにも使えると思います。例えば既存の処理に対してメソッドを追加すれば実現できそうだ、という場合にデフォルト値を設定しておきます。
メソッドにデフォルト値が設定されていない場合は引数を必ず設定しなくてはなりませんが、デフォルト値を設定しておけば「必要な時だけ引数を設定すればOK」となります。そういう特性を使うことで、既存のメソッドの呼び出し元に影響を与えることなく、メソッドの処理を書き換えることが可能です。
メソッドに引数を加えてしまうと、そのメソッドを呼び出しているすべての箇所を修正する必要がありますが、デフォルト値を設定することで過去の実装への影響を考慮する必要がなくなります。そういう場合に有効です。
試しに別のパターンでコンソールアプリケーションを作成してみます。新規のコンソールアプリケーションを作成して以下を記述してみましょう。
using System;
namespace App01
{
class Program
{
static void Main(string[] args)
{
//第二引数を記述しない場合
int result1 = CalcNum(10);
Console.WriteLine("最初の結果:" + result1.ToString());
//第二引数を記述する場合
int result2 = CalcNum(10, true);
Console.WriteLine("2つ目の結果:" + result2.ToString());
Console.ReadLine();
}
//引数によって処理を変えるメソッド
static private int CalcNum(int value, bool IsSquared = false)
{
if(IsSquared == false)
{
//通常なら2倍する
return value * 2;
}
else
{
//第二引数がtrueなら2乗する
return value * value;
}
}
}
}
もし、最初のメソッドが既存から記述されている古いメソッドであり、2つ目のメソッドが、新規で追加した呼び出し元であるとした場合、1つ目のメソッドの呼び出し元に対して修正を加えることなく実装を続けることができます。
引数にデフォルト値を設定する価値は、こうした場合にも利用することができます。あまり頻繁に使用することはないのかもしれませんが、知っておくと便利なメソッドの記述方法ですので覚えておいて損はないと思います。