C#で省略可能な引数を持つメソッドを定義するコードを紹介します。
C#のメソッドでは通常はメソッド内の処理で利用する値を引数として定義します。使われない値は引数には定義されません。
そのため、ほとんどの場合において引数の値が決まっています。
しかし、メソッドのロジックによっては特定の条件や引数のパターンなどで引数が処理に利用されない場合があります。
または、値はメソッドで利用されますが、ほとんどの場合で決まった値を与える場合もあります。
呼び出し時に毎回決まった値を記述するとコードが冗長になります。
こうした場合において、メソッドの呼び出し時に引数を省略して記述できるようにしたいです。
この記事ではC#のメソッドの引数を省略可能にするコードを紹介します。
省略可能な引数を持つメソッドを定義する場合、下記の書式を利用します。引数を省略すると[デフォルト値]が引数に代入されます。
メソッド定義の全体は下記の書式となります。
記述例を紹介します。
下記の記述では、DemoProcの引数 name
, age
は2つとも省略可能です。省略するとname
にはdefault name
がage
には0
の値がデフォルト値として与えられます。
public void DemoProc(string name = "default name", int age = 0)
{
...
}
下記の記述では、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を作成します。ボタンと複数行のテキストボックスを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]をクリックします。メソッドが呼び出され、テキストボックスに文字列が出力されていることが確認できます。引数を省略したメソッドも呼び出されていることがわかります。