C#::参照型の値渡し

C#では参照型・値型を問わず基本的に関数の引数は値渡し。参照渡しするにはrefキーワードを使用する。

参照型の値渡しって何さ?引数がオブジェクトのハンドルを受け取るのさ。
参照型の参照渡しって何さ?引数がオブジェクトを参照している変数を受け取るのさ。
これをC++で書くとこうなる。

void procA(CLASSA* obj);   //参照型の値渡し
void procB(CLASSA** obj);  //参照型の参照渡し

どちらの場合もobjのプロパティの編集ができるのは同じ。後者の場合、呼び出しもとの変数まで書き換えてしまう。

void procA(CLASSA obj){
  obj.Value = "procA";
  obj = null;
}
void procB(ref CLASSA obj){
  obj.Value = "procB";
  obj = null;
}
void test(){
  a = new CLASSA();
  b = a;
  procA(a);
  Console.WriteLine(a.Value);	//"procA"
  procB(ref b);
  Console.WriteLine(a.Value);	//"procB"
  Console.WriteLine(b.Value);	//ぬるぽ!
}

これが分かっていないと痛い目を見るよ!

ところで、C++で言うところの

void procC(CLASSA obj);

は存在しない。どうしてもやりたければIClonableを実装してクローンして渡すしかないよ!