普通は役に立たんstructだな…

今日、C#のプログラムをいじくってました。
主に構造体がいいかクラスがいいかの問題。
構造体は変数が実体、クラスは変数の他に実体がある。
そんなわけで構造体の型を値型、クラスの型を参照型と言うわけだな。
C#ではこの2つの扱いが非常に似ていますが、実際はとんでもないことです。


構造体は粘土玉、クラスは風船だろうか。
粘土板は粘土をちぎるだけで作れる、一方風船はふくらませるのに時間がかかる。
しかし実際は風船は軽い。持ち運びには風船はいい。
これについて実験した資料がある。
時代錯誤に今更こんなことを検証するのかよ! C#で何バイトなら構造体にして許容できるか? (Smart Way! オータム マガジン)
16Bytesが境界みたいだね。予想よりもクラスは有利なようだ。
他にクラスの利点は、継承ができること、参照渡しであること。
この参照渡しであると言うことはそれはそれで悩ましい問題だけどね。


さて、いろいろ実験してたのだが、やはりクラスというのは優れている。
構造体にすることで性能が上がるかという実験をしてました。しかし結論はクラスがいいと。
もともと構造体だったものまで一部見直してクラスにするぐらいです。
一見、Dictionaryのキーを参照型にするのはアホにしか見えないことだ。
しかし、実際は参照型を使った方が性能をいい。
うーん…参照型前提で作られてるのかな。値型と参照型の行き来はちょっとあるからねぇ。
それともう1ついいのが、継承という考えがあること。
fooクラスがbarクラスを継承していたら、次のようなことをしてもfooクラスのインスタンスmyfooの実体の変化は何もない。

bar mybar=myfoo;
foo anotherfoo=(foo)mybar;

構造体には継承という考え方がないから、値型同士の行き来をしようとすると、
型変換演算子を作らないとできない。けどそうすると実体を何度も作ったりといろいろ困る。
インターフェースは、参照型だしねぇ…
まぁこんなところを見てても、値型は非常に息苦しい。


まぁ難しいことを言ってるのだが、
結論から言えば、構造体を使って性能が上がることはほとんどないから、クラスを使うのがいいでしょう。
そういうことなんだと思います。
今日いろいろ試したけど、構造体を使って性能が上がった気がする出来事なんか無かった。
まぁそんな構造体、何がいいのかというと、違う変数に代入するだけでコピーできることでしょうか。
なんか間違ってる気がするけどね。