メソッド、関数の引数のoutパラメーター渡し - C#
関数の引数をoutパラメーターで指定した呼び出しについて紹介します。
概要
outパラメーターを用いた場合の動作は
パラメーターの参照渡しと同じ動作ですが、出力専用として処理されます。そのため呼び出し元で与えた値は初期化されます。
書式
メソッド(関数の宣言)
関数の宣言部の引数に out を記述します。~
メソッドの呼び出し部分
関数の呼び出しの引数に out を記述します。~
書式例
メソッド(関数の宣言)
private int myfunc(out int param1, out int param2, int param3)
{
...
}
メソッドの呼び出し部分
myfunc (out value1, out value2, value3);
プログラム例1
関数の引数の参照渡しで作成したプログラムと同様の処理をoutパラメーターを利用したコードで記述します。下記コードとなります。
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 PassingArgsByOut
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int x = 120;
int y = 40;
int z = Add(out x, out y);
textBox1.Text += string.Format("x:{0:d}\r\n", x);
textBox1.Text += string.Format("y:{0:d}\r\n", y);
textBox1.Text += string.Format("z:{0:d}\r\n", z);
}
private int Add(out int a, out int b)
{
int c = a + b;
a = a + 100;
b = b + 100;
return c;
}
}
}
上記のコードをコンパイルするとコンパイルエラーになります。
コンパイルエラーの原因
private int Add(out int a, out int b)
{
int c = a + b;
a = a + 100;
b = b + 100;
return c;
}
Addメソッドでoutパラメーターが引数に指定されています。outパラメータが指定されている場合、引数は関数の実行時に未割当ての状態になります。未割当の状態で int c = a + b を実行すると、変数 a, bは未割当のため、未割当の変数を参照したエラーとなり、コンパイルに失敗します。
プログラム例2
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 PassingArgsByOut
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int ox;
int oy;
int z = Func(out ox, out oy);
textBox1.Text += string.Format("x:{0:d}\r\n", ox);
textBox1.Text += string.Format("y:{0:d}\r\n", oy);
textBox1.Text += string.Format("z:{0:d}\r\n", z);
}
private int Func(out int a, out int b)
{
a = 2400;
b = 160;
return a - b;
}
}
}
解説
private int Func(out int a, out int b)
{
a = 2400;
b = 160;
return a - b;
}
outパラメータで渡された引数は未割当ての状態になります。a,b に値を代入しout パラメータで渡された変数を初期化します。関数の戻り値は 変数aから 変数bを引いた値になります。outパラメーターが指定されているため、参照渡しと同じ動作になるため、初期化した変数 a,b の値は呼び出し元の変数にも反映されます。
実行結果
上記のコードのプロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。xの値はFuncメソッドで初期化された変数aの値が表示されます。yの値にはFuncFuncメソッドで初期化された変数bの値が表示されます。zの値は、変数aから変数bの値を引いた値が表示されます。
参考コード
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 PassingArgsByOut
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int ox=1000;
int oy=100;
int z = Func(out ox, out oy);
textBox1.Text += string.Format("x:{0:d}\r\n", ox);
textBox1.Text += string.Format("y:{0:d}\r\n", oy);
textBox1.Text += string.Format("z:{0:d}\r\n", z);
}
private int Func(out int a, out int b)
{
a = 2400;
b = 160;
return a - b;
}
}
}
outパラメーターを利用した場合、関数(メソッド)に与えた値は関数実行時に初期化されるため、どのような値を与えても結果は変わりません。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用