省略可能な引数を持つメソッドを定義する - C#

C#で省略可能な引数を持つメソッドを定義するコードを紹介します。

概要

C#のメソッドでは通常はメソッド内の処理で利用する値を引数として定義します。使われない値は引数には定義されません。 そのため、ほとんどの場合において引数の値が決まっています。
しかし、メソッドのロジックによっては特定の条件や引数のパターンなどで引数が処理に利用されない場合があります。 または、値はメソッドで利用されますが、ほとんどの場合で決まった値を与える場合もあります。 呼び出し時に毎回決まった値を記述するとコードが冗長になります。
こうした場合において、メソッドの呼び出し時に引数を省略して記述できるようにしたいです。

この記事ではC#のメソッドの引数を省略可能にするコードを紹介します。

書式

省略可能な引数を持つメソッドを定義する場合、下記の書式を利用します。引数を省略すると[デフォルト値]が引数に代入されます。
メソッドの引数部の書式
引数の型 引数名 = デフォルト値
メソッド定義の全体は下記の書式となります。
メソッド定義全体の書式
アクセス修飾子 戻り値型 メソッド名(引数の型1 引数名1 = デフォルト値1, 引数の型2 引数名2 = デフォルト値2, .... 引数の型n 引数名n = デフォルト値n)

記述例

記述例を紹介します。

例1

下記の記述では、DemoProcの引数 name, age は2つとも省略可能です。省略するとnameにはdefault nameageには0 の値がデフォルト値として与えられます。
public void DemoProc(string name = "default name", int age = 0)
{
  ...
}

例2

下記の記述では、GetProductの引数 name は省略できませんが、IncludeOutOfStock は省略可能です。
IncludeOutOfStockを省略すると false がデフォルト値として与えられます。
public void GetProduct(string name, bool IncludeOutOfStock = false)
{
  ...
}

利用シーン

下記のコードで subproc を呼び出していますがほとんど場合、第二引数が1で第三引数は0を与えています。特殊な場合以外は第二引数と第三引数を省略して記述したいです。~
  public void proc()
  {
    subproc("ぺんぎん", 1, 0);
    subproc("あひる", 1, 0);
    subproc("らくだ", 1, 0);
    subproc("しまうま", 1, 0);
    subproc("ふくろう", 1, 0);
    subproc("かるがも", 1, 0);
    subproc("まんもす", 2, 1);
  }

  public void subproc(string name, int flag, int option){
    /* 略 */
  }

省略可能な引数を設定することで下記のコード記述ができます。
  public void proc()
  {
    subproc("ぺんぎん");
    subproc("あひる");
    subproc("らくだ");
    subproc("しまうま");
    subproc("ふくろう");
    subproc("かるがも");
    subproc("まんもす", 2, 1);
  }

  public void subproc(string name, int flag = 1, int option = 0){
    /* 略 */
  }

プログラム例

WindowsFormアプリケーションを作成します。

UI

下図のUIを作成します。ボタンと複数行のテキストボックスを1つずつ配置します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OptionalArguments
{
  public partial class FormSimpleOptionalArguments : Form
  {
    public FormSimpleOptionalArguments()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      OutputProductInfo("かるがもサブレ", 0.30, 450);
      OutputProductInfo("ぺんぎんクッキー", 0.25, 230, 7);
      OutputProductInfo("しろくまケーキ", 0.15, 380);
    }

    private void OutputProductInfo(string name, double weight, decimal price, int stock = 0)
    {
      if (stock > 0) {
        textBox1.Text += string.Format("{0} {1:f} {2:g} / 在庫 {3:d}\r\n",name, weight, price, stock);
      }
      else {
        textBox1.Text += string.Format("{0} {1:f} {2:g} / 在庫なし\r\n", name, weight, price);
      }
    }
  }
}

解説

下記のコードが引数省略可能なOutputProductInfoメソッドになります。今回のコードでは、第三引数のstockが省略可能な引数となります。第三引数が省略された場合、stock変数には0が代入されて呼び出されます。
メソッド内では引数として渡された値をテキストボックスに表示しています。
  private void OutputProductInfo(string name, double weight, decimal price, int stock = 0)
  {
    if (stock > 0) {
      textBox1.Text += string.Format("{0} {1:f} {2:g} / 在庫 {3:d}\r\n",name, weight, price, stock);
    }
    else {
      textBox1.Text += string.Format("{0} {1:f} {2:g} / 在庫なし\r\n", name, weight, price);
    }
  }

下記のコードがOutputProductInfoメソッドの呼び出しコードになります。1行目と3行目のメソッド呼び出しの記述が引数を省略した呼び出しになります。
  OutputProductInfo("かるがもサブレ", 0.30, 450);
  OutputProductInfo("ぺんぎんクッキー", 0.25, 230, 7);
  OutputProductInfo("しろくまケーキ", 0.15, 380);

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。メソッドが呼び出され、テキストボックスに文字列が出力されていることが確認できます。引数を省略したメソッドも呼び出されていることがわかります。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2021-01-19
作成日: 2018-05-22
iPentec all rights reserverd.