[C#] value type と reference type

structが”light weight class”と考えてよいとはいえ、大きな違いがある。それは、structureはvalue typeであるのに対し、classはreference typeである、ということ。
メモリ上の割り付けが value typeはstackに積まれてスコープから外れたところでstackからpopされ消去される。これはCの動的変数などと同じ。
reference typeはheapに割りつけられて参照がなくなったときにガーベジコレクションで回収される。Cのmalloc()で割りつけたあとにfree()を実行ライブラリが面倒を見てくれる感じ、かな。
コピー
value typeは基本的に代入されると値がコピーされるので同じものが二つできる。それに対して、reference type(たとえば、class object)を代入すると参照をコピーするだけで丸ごと同じものができるわけではない。
これはCで言うとポインターをコピーする感じに近い。
たとえば、structのメンバーにclassが入ることは可能だ。全体はvalue typeだが、中身にreference typeが混ざったとき、代入を行うとvalue typeのメンバーはコピーされるがreference typeのメンバーは参照がコピーされ実体は1つになる。
これに対策するにはIClonableインタフェースを実装して、クローンを作る能力を与える方法がある。

広告
%d人のブロガーが「いいね」をつけました。