C#の構造体についての話。(struct)
こんにちは。みなみんです。
C#入門シリーズの続きです。
今回は構造体について記事にしました。
目次
構造体
構造体とは
簡単に言うと、クラスとほぼ同じです。
構造体のメンバ変数やメンバ関数を定義して、その構造体に値を格納する事ができます。
構造体の定義
構造体の定義は「struct」キーワードを使います。
実際に構造体を定義してみました。(Gist)
使い方はクラスと全く一緒ですね。
struct [構造体の名称] { }
クラスと構造体の違い
C言語など、非オブジェクト指向の言語はクラスという概念が無く、全て構造体で定義していたようです。
だがC++や、まさに今扱っているC#は「オブジェクト指向」なので、クラスという概念があります。
そこで、クラスと構造体の違いがよく分からないですよね。
両者の違いを次の項でまとめてみました。
クラスと構造体の違い
クラスのように「継承」ができない。
オブジェクト指向で最大の特徴である「継承」は構造体ではできません。出来るのはクラスだけです。
クラスは参照型、構造体は値型。
変数にした場合、intとかfloatとか、数値系の型はインスタンスを持たない。そして、値をそのまま代入ができる。これらは全て「値型」と呼んでいる。
一方で、クラス型とかオブジェクト型とかという、インスタンスを有する型は全て「参照型」と呼んでいる。
両者の大きな違いというのは、代入時に値・インスタンスをコピーするか、しないかの違いである。
インスタンスを有する変数は代入時、基本的にインスタンス自体のコピーは行わない。
一方で、インスタンスを有さない「値型」は代入時、値のコピーを行う。
違いを理解するために、サンプルを用意した。(Gist)
このように、値を代入する際の振る舞いが少し違う。
これが、「値型」と「参照型」の違いである。
要するに、参照型のインスタンスはコピーができずに変数が違っても、値は共通化してしまう。過去に紹介した記事での、関数の「参照渡し」みたいな現象が起こる。
構造体は引数のないコンストラクタ・デストラクタは定義不可。
構造体のメンバ変数は呼び出し時、自動的に全て初期化される。なので、引数なしのコンストラクタ・デストラクタは不要なんですね。
引数のあるコンストラクタの定義は可能。ただし、コンストラクタを定義する場合は、全てのメンバ変数を初期化する必要があります。そうでないと、エラーになります。
「静的構造体」は不可。
クラスでは「静的クラス」は可能なものの、構造体で「静的構造体」はできません。
ただし、構造体のメンバ変数の静的化は可能です。
この記事に誤りがあるかもしれません。その辺はご了承ください。
本記事で紹介されている方法・手法はあくまでも個人的なものです。