【C#】引数の値渡し、参照渡し(ref, out)

メソッドに値を引数で渡す場合、値渡し参照渡しというものがあります。

メソッド内で処理した結果を処理後に必要な場合には参照渡しにする必要があるのですが、まずはコード例から。

static void Main(string[] args) 
{ 
	int a1; 
	int a2; 
	int a3; 
	
	a1 = 1; // 値を代入しておく必要がある 
	Method1(a1); // 処理後:a = 1 

	a2 = 1; // 値を代入しておく必要がある 
	Method2(ref a2); // 処理後:a = 11 

	//a3 = 1; // 値を代入しておく必要がない(意味がない) 
	Method3(out a3); // 処理後:a = 10 
} 

// 値渡し 
public static void Method1(int a) 
{ 
	a += 10; // メソッド内では a = 11 となる 
} 

// 参照渡し(ref) 
public static void Method2(ref int a) 
{ 
	a += 10; 
} 

// 参照渡し(out) 
public static void Method3(out int a) 
{ 
	//a += 10; // エラー:未割り当てのoutパラメータ'a'が使用されました。 
	a = 10; 
}

Method1は値渡しの例ですが、aの値はメソッドで受け取れるものの、処理後のaは処理前のaの値と同じままです。

 

Method2は参照渡し(ref)の例ですが、aの値はメソッドで受け取れ、処理後のaもメソッド内で処理した値が繁栄されます。

参照渡し(ref)で渡す引数はメソッドに渡す前に必ず初期化(値を代入)しておく必要があります。

 

Method3は参照渡し(out)の例ですが、aの値を受け取れないものの、処理後の値はメソッド内で処理した値となります。

参照渡し(out)で渡す引数はメソッドに渡す前に初期化しておく必要はありません。

 

これらの動きは私のイメージではこんな感じ↓なのですが、伝わるでしょうか?

 

使い分け的には、一般的な処理では値渡しで十分な場合が多いかと思いますが、処理した結果が必要な場合には参照渡しとなります。

refとoutの違いについては、refでは引数の初期化が必要になりますが、outではその必要がありません。

そのため、メソッド内で引数で渡された値が必要な場合には、ref、必要の無い場合にはoutを使うとよいかと思います。

 

C#へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください