C#での、先日のあれについて、ようやく書いてある部分を見つけました。
下手に他言語を利用している関係で、全く読んでいなかったC#の基本的なドキュメントの中にその説明がありました。
VS2005のドキュメントで言うと
「データ型 (C# プログラミング ガイド)」
に記載されてあり、
・値を格納する 値型 (C# リファレンス)
・実際のデータへの参照を格納する 参照型 (C# リファレンス)
の二種類あることが明記されています。
で、=を使うと山椒が入るのが、「参照型」と言うわけですね。
それで、その参照型は主に
class
他にも「interface」とか「delegate」とかも有りますが、
そもそもインターフェイスはそもそもオブジェクトへの参照の定義ですし、
delegateは関数への参照の定義ですし、まぁはじめから参照ですね
特殊な部類に
「object」「string」が有りますが、stringが参照型というのはC++のときからそうですし、「object」はclassルートですから、まぁあえてオブジェクトにする「ボックス化」と言うところで特殊用途みたいです。
まぁ「classが参照型」と覚えるのが良いでしょう。
値型というのは、まぁintとかそのあたり
それ以外のは「struct」「enum」ですね。
値をいくらでも宣言できる物として「class」と「struct」を同一視する人がいますが、実際には、かなり違う物です。
構造体は、データのひとまとめであって、まとめただけ
classはメソッドを作らなければ構造体と大差ない状態になりますが、データとそれを扱う関数群となります。
あと、構造体は値型なので、=で代入先に複製が作成されるのですが、class等を含む場合、簡易コピーされてしまうので、クラスは参照型代入されます。
構造体に含まれるクラスを変更すると、元の構造体のクラスも変更されてしまうので要注意です。
クラスを含む場合は、構造体ではなくクラスにしてしまい、cloneメソッドを作成しておくのが良いかもしれません。
ICloneable インターフェイスを定義しておくことで、クラスが複製できることを明確に宣言できますし、こっちの方が良いでしょう☆
ちなみに、cloneメソッドの中では必要なデータを全部複製させる機能をだらだら書き込む必要が有ります。 |