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を実装してクローンして渡すしかないよ!