
今回は、C#における値渡しと参照渡しについて紹介していきます。
関数を使用するときに、パラメータを使用すると思うので、しっかり理解しておきましょう。
関数の使い方がわからない方はこちらの記事も参考にしてみてください。
値渡し 参照渡し
関数(メソッド)を呼び出すときに、引数(パラメータ)を渡す方法が2つあります。それが、「値渡し」と「参照渡し」です。
まずは、値渡しと参照渡しのイメージをつかみましょう。
「値渡し」は、呼び出し元の変数をコピーし、メソッド内で使用するイメージ。
「参照渡し」は、呼び出し元の変数を、メソッド内でも共有して使用するイメージ。
なので、メソッドを作成するときに、
引数の値をメソッド内で変更したくないときは、「値渡し」
引数の値をメソッド内で変更(更新)したい時は、「参照渡し」
を利用しましょう。
値渡し
それではさっそく例を見ていきましょう。まずは値渡しのやり方を紹介していきます。
関数名 (型 引数名)
{
処理
}
下のような画面を作成しました。
値渡しボタンを押下した時に、labelにメッセージを表示するような例を作成しています。
private void BtnAtai_Click(object sender, EventArgs e)
{
string str = "デフォルトの値";
callMsg(str);
lblMessage.Text = str;
}
private void callMsg(string msg)
{
msg = "値渡しの例です";
}
解説
3行目:変数を宣言し、値を設定
4行目:関数を呼び出し、引数は値渡しで設定
5行目:ラベルに、変数の値を表示
8~11行目:値渡しの関数を作成
10行目:引数の値を変更
結果
値渡しでは、関数で設定した値は、ラベルには表示されていません。
参照渡し
つづいて、参照渡しについてみていきましょう。
関数名(ref 型 引数名)
{
処理
}
このように、参照渡しをする時は、引数の型を宣言する前に「ref」を記載しましょう。
private void BtnSansyo_Click(object sender, EventArgs e)
{
string str = "デフォルトの値";
callMsgRef(ref str);
lblMessage.Text = str;
}
private void callMsgRef(ref string msg)
{
msg = "参照渡しの例です";
}
解説
4行目:関数を呼び出している。呼び出し元でも、引数の前に「ref」を記載
8行目:関数を作成、引数には「ref」を記載し、参照渡しを行うように設定
結果
このように、参照渡しの例では、関数で設定した値が、呼び出し元の変数にも影響されています。
まとめ
関数を使用するうえで、値渡しと参照渡しの違いは必ず理解しておきましょう。
引数の値をメソッド内で変更したくないときは、「値渡し」
引数の値をメソッド内で変更(更新)したい時は、「参照渡し」
今回、参照渡しの例として、「ref」を使用していますが、「in」「out」というのも存在します。
これらの違いについても、紹介していきたいと思います。
初心者の方はとりあえず、値渡しと参照渡しの違いのみを覚えておきましょう。