【C#.NET】 値渡しと参照渡し
値型をメソッドの引数に指定すると値渡しとなる。
参照型をメソッドの引数に指定すると参照渡しとなる。
値渡しは値がコピーされるのに対し、参照渡しは参照がコピーされる。
基本的にはJavaと同様ですね。
※もちろん、メソッドの引数に渡すだけではなく、変数やプロパティへの代入も同様の動作をします。
しかし、JavaとC#では値型の定義に違いがあります。
Javaの値型(プリミティブ型)はbyte, short, int, long, char, float, double, booleanの8つですが、C#の場合は構造体と列挙体が値型になります。
・構造体(struts)・・整数型, 浮動少数点型, decimal, bool, ユーザー定義のstruts型など。
・列挙体(enum)
※ 値型の詳細は下記のmsdnを参照
http://msdn2.microsoft.com/ja-jp/library/s1ax56ch.aspx
※ C#の参照型の例としては、stringやユーザー定義のクラスなどが挙げられる。
ところで、C#では値型を参照渡しする方法もあります。
メソッドの呼び出し元と呼び出し先の変数の前に
refまたはoutを指定する方法です。
refとoutの違いですが、refは入出力用、outは出力用の用途で使用します。
refの場合、メソッドにオブジェクトを渡す前にあらかじめ初期化しておく必要があります。
初期化をせずにrefオブジェクトとしてメソッドに渡した場合は、以下のようなビルドエラーとなります。
[未割り当てのローカル変数'hogehoge'が使用されました。]
outは初期化の必要はありません。初期化しても怒られませんが、意味がありません。
outを使った場合に、メソッド内で初期化処理をせずにメソッドの引数を読み取ろうとすると以下のようなビルドエラーが発生します。
[割り当てのないoutパラメータ'hogehoge'の使用です。]
outでは事前に初期化処理をしなくてもいいかわりに、
メソッド内で初期化処理をする必要があるのです。
もし、メソッド内で初期化をしなければ、これまた以下のようなビルドエラーとなってしまいます。
[outパラメータ'hogehoge'はコントロールが現在のメソッドを抜ける前に割り当てられる必要があります。]