メソッド、関数の引数の値渡し - C#
関数の引数の値渡しについて紹介します。
概要
関数に引数(パラメーター)を渡す際の標準の渡し方が「値渡し」になります。値渡しで渡されたパラメーターは呼び出し先の関数内に閉じた値になります。
プログラム例
UI
Windows フォームアプリケーションを作成し、下図のUIを作成します。ボタンと複数行のテキストボックスを配置したフォームです。
コード
下記のコードを記述します。
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 PassingArgsByValue
{
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(x, 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(int a, int b) {
return a + b;
}
}
}
解説
Addメソッド(関数)にa,b2つの引数を与えて呼び出します。aとbの和が戻り値として返ります。テキストボックスに、Addメソッドに与えたパラメーターと関数からの戻り値の値を表示します。
実行結果
上記のプロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。xの値120, yの値40, xとyの値の和であるzの値160がテキストボックスに表示されます。
コードの変更
続いてコードを下記に変更します。
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 PassingArgsByValue
{
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(x, 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(int a, int b) {
int c = a + b;
a = a + 100;
b = b + 100;
return c;
}
}
}
解説
先のコードとほぼ同じですが、Addメソッド内でaとbの和を計算した後、a,b にそれぞれ100を加算しています。
実行結果
上記のプロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。xの値120, yの値40, xとyの値の和であるzの値160がテキストボックスに表示されます。先のプログラムと同じ結果になります。Addメソッド中でパラメーターの値を変更しても呼び出し元の変数には反映されないことが分かります。
動作の違いの確認
関数の参照渡しのページで動作の違いを確認できます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用