「値」と「参照」の話 ( No.67 )
日時: 2023/04/23 12:33
名前: REDCHEEKS

コラムにも書いた通り >>59 >>63 ポインタはあまりにも危険なので封印されたが、より安全なものに形を変えて今でも存在する。

それが参照なんだ。

そして、コンピュータ処理においては、単一の数値のような小さなデータを除けば「参照」が基本になっている。

なぜなら、大きなデータを「参照」ではなく「値」で渡そうとすると、多量のデータをコピーせねばならなくなり、多量のメモリやCPUパワーを消費するからだ。

いくらメモリやCPUが安くなったとはいえ、これでは具合が悪い。

なるべく動かさないで済むものは、動かさない方がいいね。

どこにあるかという情報(ポインタ)さえ渡せばそれでいいのだ。

そもそも文書で「〇〇を参照」と書けばいいのを、そこにいちいち全文コピーする人はいないだろう。

但し、参照には、副作用がある、特に参照先に、書き込み変更を加える場合だ。

ということで、以前からの続き、課題H を使ってまたエッチな話をしよう。

*************************************
じじぃはエッチが好きだよ > 妄想プロファイラー君
*************************************

http://mediasp.kir.jp/img20220326/imgloglog-box/img20230422112631.png

@ 課題Hの、Main() 関数内の、red を定義している部分だけを残し、それ以外を(コメント化するか又は)削除する。
A 人クラスに、ICloneable インターフェースを追加する(これで人もクローン可能になる)。
B Clone() メソッドを実装する。
C 現状報告 メソッドを実装する。
D red をクローンして、クローン人間 red2 を作り、名前を REDCHEEKS(2) とする。
E 原本の red をお仕置きし、red と red2 に、現状を報告するようにプログラムする。
F 「課題H」をクリックし実行する。

G 2人ともお尻が真っ赤になってしまう。

お仕置きされたのは、red だけなのに、red と red2 ともに真っ赤になったのは、同じ尻を参照し共有しているからだ。
この現象を見て、あなたはどのような状況を思い浮かべるだろうか、共通の尻を持つ、シャム双生児のような状況ではなかろうか?

※ シャム双生児といえば、ベトナム戦争の「ベトちゃんドクちゃん」が有名だね。
http://ja.wikipedia.org/wiki/%E7%B5%90%E5%90%88%E5%8F%8C%E7%94%9F%E5%85%90


この問題を解決するには、B を修正する。

以下に示す通り「クローン人間のために新しい尻を作成し参照させる」機能を追加すればよい。

***************************************************************************
/// <summary>
/// クローン人間を作成する
/// </summary>
/// <returns></returns>
public object Clone()
{
   var クローン人間 = (人)MemberwiseClone();

   クローン人間.尻 = new けつ();     // クローン人間のために新しい尻を作成し参照させる【追加】

   return (object)クローン人間;
}
***************************************************************************

これで分離手術はOKだ。