【C#】値渡しと参照渡し

スポンサーリンク

値渡しと参照渡しって何??ってなりますが、簡単に説明すると

関数を作るときに引数の渡し方の種類

引数の渡し方は、どの言語にも言える事なので覚えておきましょう。

値渡しってなに??

「値渡し (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』を書くと参照渡しですよ」と言いましたが、例外があります。

引数に配列やリストなどを使った場合、参照渡しになります。

値渡しのつもりでも引数の型に応じて、参照渡しになる事がある事を覚えておきましょう。

最後に

プログラミング初級者を対象に、値渡しと参照渡しの違いを説明しました。

初級者がつまづきやすい、参照の値渡しについても説明しました。

メモメモ。。。

コメント

タイトルとURLをコピーしました