C#の参照型だってポインタに負けないんだから

C#の勉強会が始まっていろいろやってたけど、
クラスの型、参照型と、構造体の型、値型の違いって難しいですね。
参照型は実体の参照Aが、値型は実体Bが変数に入ってると。
そして、変数の代入、メソッドに値渡ししたとき、
参照型は実体aの参照のコピーA’が渡されて、値型は実体のコピーB’が渡される。
値型のコピーであるB’をいじくったところで、もとのBは変わらない。
参照型のコピーであるA’を見ながら、実体aをいじくることはできる。
このとき、もとのAを見ながら実体aを参照すればいじくられてることになる。
しかし、もし新しいインスタンスcを作成して、それの参照をA’に入れたとしても、
もとのAはそのままaを参照してるので、変わらない。


この事実は結構大切なことです。
しかし、C#では参照型と値型の区別が付きにくいので無視されやすい。
だから僕は昔迷った。

byte[] buf=new byte[16];
//中略
fs.Read(buf, 0, buf.Length);

これについてもこの考えで考えよう。
まず、byte[]のインスタンスXをメモリ上に作成して、変数bufにXの参照を入れる。
Readメソッドに、bufのコピー、b’を渡す。それで、b’の指すXを見る。
それでXをいじくる。そしてその後にbufを見るとその指す先Xは変更されていると。
そう考えるとわかる。しかし、ここではbyte[]が参照型であるという事実が必要。
C++/CLIではC#における参照型は^を付けたハンドル型の変数を使うのでわかりやすい。
確かにちょこちょこ出てきてスマートじゃないけどね。


Cのポインタってなんかうっとうしいという話もあるけど、
C#の参照型というのもなにげにめんどくさいもんです。
この事実を絵に描いて覚えるということは大切ですね。
そうすれば、うまいことやれますよ。
foreachで回しながら、データをいじくることもできるようになりますよ。