C#の値渡しと参照渡し(refパラメーター)の違いを徹底解説
C#では、メソッドに引数を渡す方法として「値渡し」と「参照渡し」の2種類があります。それぞれの仕組みの違いを理解することは、バグの防止や効率的なコード設計において非常に重要です。本記事では、両者の違いをわかりやすく解説します。
参照パラメーター(参照渡し)とは
参照パラメーターとは、変数が格納されているメモリ上の位置(アドレス)への参照を表すものです。参照パラメーターは、メソッドに渡された実引数と同じメモリ位置を共有します。
そのため、パラメーターを参照渡しにした場合、値渡しとは異なり、新しいストレージ領域は作成されません。メソッド内でパラメーターに行われた変更は、呼び出し元の変数に直接反映されます。
C#では、refキーワードを使うことで参照渡しを実現できます。
値渡し(Pass by Value)とは
値渡しは、C#におけるデフォルトの引数渡しの仕組みです。この仕組みでは、メソッドが呼び出されると、各値パラメーターに対して新しいストレージ領域が作成されます。
そして、実引数の値がその領域にコピーされます。したがって、メソッド内でパラメーターに対してどのような変更を行っても、呼び出し元の引数には一切影響しません。
コード例で確認する違い
実際のコードで動作の違いを見てみましょう。
using System;
class Program
{
// 値渡し:コピーが渡される
static void PassByValue(int num)
{
num = 100;
}
// 参照渡し:同じメモリ位置を操作する
static void PassByReference(ref int num)
{
num = 100;
}
static void Main()
{
int a = 1;
PassByValue(a);
Console.WriteLine(a); // 出力:1(変更されない)
int b = 1;
PassByReference(ref b);
Console.WriteLine(b); // 出力:100(変更される)
}
}
この例からわかるように、値渡しではメソッド内での変更が呼び出し元に影響しないのに対し、参照渡しでは元の変数そのものが書き換えられます。
まとめ:使い分けのポイント
- 値渡し:メソッド内での変更を呼び出し元に反映させたくない場合に使用。安全性が高く、意図しない副作用を防げます。
- 参照渡し(ref):メソッド内での変更を呼び出し元の変数に反映させたい場合に使用。複数の戻り値が必要な場面などで有効です。
なお、初期化されていない変数を渡す場合はoutキーワードも検討するとよいでしょう。outは参照渡しの一種ですが、メソッド内で必ず値を代入することが求められる点がrefと異なります。
-
C#のfloat・double・decimalの違いを徹底解説!精度・範囲・メモリサイズの比較と使い分け
C#には、小数点を含む数値を扱うためにfloat(浮動小数点型)、double(倍精度浮動小数点型)、decimal(10進数型)の3つの型が用意されています。これらはすべてC#における値型(Value Type)に分類されます。 値型の変数には、値を直接代入することができます。これらの型はすべて System.ValueType クラスから派生しており、変数自体がデータを直接保持するという特徴があります。 一見似ているこの3つの型ですが、精度・表現できる範囲・メモリサイズが異なるため、用途に応じた使い分けが重要です。以下、それぞれの特徴を詳しく見ていきましょう。 float型(単精度浮動小数
-
C#のrefパラメーターとoutパラメーターの違いとは?使い分けのポイントを解説
C#には、メソッドに引数を渡す際に変数そのものへの参照を渡すための仕組みとして、「refパラメーター」と「outパラメーター」の2種類が用意されています。どちらも呼び出し元の変数の値をメソッド内から直接操作できる点は共通していますが、初期化の要否や代入のルール、想定される用途に違いがあります。本記事では、サンプルコードを交えながら、両者の違いをわかりやすく解説します。 refパラメーター(参照パラメーター)とは refパラメーターは、変数のメモリ上の場所(参照)をそのまま渡す仕組みです。通常の値渡しとは異なり、新しいストレージ領域は作成されません。そのため、メソッド内で行った変更が、そのまま呼