もともと私はCからプログラミングに入った人間で、「構造体とは新たな型を宣言するものである」という固定観念を持っていた。その考え方は、こうやってC#のプログラムを書き始めても続いていた。ところが、さっき何気なく見ていたメタファイルに、構造体であるにも関わらずにメソッドを持つやつがいた。
なんじゃこりゃと思って調べてみると、どうやらC#の構造体はメソッドを持つこともできるようだ。クラスと構造体の違いを調べてみたので、簡単に重要だと思った所だけ箇条書きにしておく。
- クラスは参照型で、構造体は値型(これは当り前か)
- クラスでは引数のないコントラクタを実装するとデフォルトコンストラクタが実行されない。一方、構造体は引数を持たないコンストラクタを宣言できないんだそうだ。この理由は、言語設計レベルまで関係するらしい。はてなに詳しい説明をしてる人がいた。
- 構造体では、フィールド変数の宣言と同時に初期化ができない
- 構造体では、デストラクタが宣言できない
なぜ参照型と値型で区別して存在するかというと、参照型には本来フィールドを格納するメモリ領域とはべつに、クラス自体の機能を提供するためのオブジェクトヘッダーなるものを保持しているそうだ。それが、中々重いことになったりしているらしい。なるべく少なくするようにコンパイラでも最適化されてるみたいだけど、限度があるっていうような意味が書いてあった。