メソッド、関数の引数の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を愛用
掲載日: 2017-04-17
iPentec all rights reserverd.