値渡しと参照渡しって何??ってなりますが、簡単に説明すると
関数を作るときに引数の渡し方の種類
引数の渡し方は、どの言語にも言える事なので覚えておきましょう。
値渡しってなに??
「値渡し (call by value)」とは、変数の値をコピーする渡し方です。
簡単な関数をつくって説明します。
private void button1_Click(object sender, EventArgs e)
{
int test = 1;
call_by_value(test);
Console.WriteLine("testの値:" + test.ToString());
}
private void call_by_value(int a)
{
a = 100;
}
結果は、
『1』のままです。
これが【値渡し】です。
参照渡しってなに??
「参照渡し (call by reference)」とは、変数を共有するような渡し方です。
値渡しの関数を参考に参照渡しの関数を作りました。
private void button2_Click(object sender, EventArgs e)
{
int test = 1;
call_by_reference(ref test);
Console.WriteLine("testの値:" + test.ToString());
}
private void call_by_reference(ref int a)
{
a = 100;
}
結果は、
『100』になりました。
これが【参照渡し】です。
値渡しと参照渡しの違い
ざっくり言うと、関数内での変数の変化を更新されるかされないかです。
もう少し理解を深めるとすれば、変数はアドレス(住所)で管理されています。
関数を定義する時に、値渡しにするか参照渡しにするかは、
値渡しは新規のアドレスに変数を作り、
参照渡しは引数のアドレスをそのまま使う事になります。
今回の関数の場合を図示するとこんな感じです。
参照渡しの時、変数名は違いますが、アドレスが同じの為、変数が変化しまいます。
C#の場合、参照渡しの時は引数の変数に《ref》をつけます。
言語によって、記述のルールは違うので、内容だけ理解しましょう。
最後に注意(参照の値渡し)
混乱を招くかもしれませんが、注意点があります。
値渡しで書いても、参照渡しになる事があることです。
private void button3_Click(object sender, EventArgs e)
{
int[] test = new int[2] { 0, 0 };
call_by_value(test);
Console.WriteLine("test[0]の値:" + test[0].ToString());
}
private void call_by_value(int[] a)
{
a[0] = 100;
}
結果は、
参照渡しの時に、「『ref』を書くと参照渡しですよ」と言いましたが、例外があります。
引数に配列やリストなどを使った場合、参照渡しになります。
値渡しのつもりでも引数の型に応じて、参照渡しになる事がある事を覚えておきましょう。
最後に
プログラミング初級者を対象に、値渡しと参照渡しの違いを説明しました。
初級者がつまづきやすい、参照の値渡しについても説明しました。
メモメモ。。。
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント