実体をコピーしたいとき、参照だけほしいとき

ベクトル使っていろいろ書いてたわけですが、まぁ完成したよと。
けど計算が随分重い。曲がる回数の多い図面は嫌うらしい。
さて、これはC#のソースです。

string[] str1 = new string[1];
string[] str2 = new string[1];
str1[0]= "foo";
str2 = str1;
str1[0] = "bar";
Console.WriteLine(str2[0]);

大きさ1の配列だが、別にclassならなんでもいいはずなんだが、stringはうまくいかん。
これを見ると、str1[0]に"foo"を入れて、これをstr2=str1としたので、この時点ではstr2[0]は"foo"だ。
しかし次を見る、str1[0]を書き換えた。するとstr2[0]も変わっているという話。
うん、これを動かすと"bar"と返ってくるよ。
ここでした代入では、実体のコピーは伴ってないということ。参照だけコピーしているということ。
もともとstr1の実体が甲地点にあったとすると、str1もstr2も実体は甲地点にあると指しているだけ。
ここで、その中身を書き換えると、甲地点の実体を書き換えるだけだから、str1もstr2も書き換えられたものを参照していることになると。
一方、メソッドの引数は値渡しなので、実体のコピーを用意して渡していますよ。
まぁ前者はあまり気にしなくてもいいような気はするのだが、後者は少し気にしないといけない。
けど実際はあまり気にしなくていいプログラムばっかり書いてる気がするけど。
たとえばmypointなるインスタンスをなんか動かすメソッドを作ると。
まぁオブジェクト指向らしいメソッドの動かしかたは、

mypoint.move(v);

だな、まぁこれでいいでしょう。インスタンス自体が勝手に動いてくれる。非常に楽ですね。
けど、ここでこのメソッドをstaticにしたと考えよう。するとこんな風になるかな。

mypoint = move(mypoint,v);

これが1つの選択肢だろう。
で、こういう風に動作させたとき、実体はどう動くかという話なんだが。
たとえば、mypointの実体がもともと甲地点にいたとすると、moveメソッドに渡すときに実体は乙地点にコピーされて、乙地点への参照をメソッドに渡すと。
そして、moveメソッドは乙地点の実体をごにょごにょいじって、多分最後には乙地点の参照を返すでしょう。
そして、mypointには乙地点の参照が入って終了。
その後暇なときに、GCが一生使われることがなくなった甲地点の実体を掃除してくれる。
GCが掃除してくれるのは.net Frameworkのしわざですよ。これがあるおかげでいちいちメモリの開放をしなくていいんだよ。
ただ、なんか無駄が多い。そこでC#ではこんな取り扱いができる。

move(ref mypoint,v);

refというの付けるようにするところは、参照渡しを使うということ。
この場合、同様にmypointの実体がもともと甲地点にいたとすると、
moveメソッドには甲地点への参照を渡す。ここが通常の値渡しとの違い。
ここでmoveメソッドで、甲地点の実体をいじって、終わり。
すると、mypointの中身がひとりでに変わってくれてる。
まぁCなんかじゃよく見るやり方だな。僕は、ひとりでに値が変わるあたりが嫌いだが。
だから、インスタンス自体が動いているように見える一番目のようなやり方をよくするわけだが。
そんな調子でいろいろ書いていってたのだが、ここで、二番目のやり方ならば、

movedpoint= move(mypoint,v);

のようなことをやりたかった。
そこでこんなソースを書きました。

point movedpoint = mypoint;
movedpoint.move(v);

結論から言えば大失敗。ここでの代入は参照しか代入できてないから。冒頭で書いたとおりです。
movedpointの実体はmypointの実体と同じ。movedpoint.move(v);の動作でmypointまでやられた。
調べてたのだが、Classのコンストラクタに、与えられたインスタンスのコピーのインスタンスを作るようなものを作ればいいと。

point movedpoint = new point(mypoint);
movedpoint.move(v);

これでいい。コピーのインスタンスは完璧なコピーを作ったわけではないのだが、まぁいいでしょう。
さて、そんな具合にソースコードを書いてたら、まぁ完成しました。
なんかいろいろ調整してたら動作もよくなってきました。
人より速く求められるのが目標だな。簡単なものならすでに実現できてるけどね。