Minaminの日記

趣味を記事にしてる。

C#の構造体についての話。(struct)

f:id:Minamin1234:20210827181741p:plain

こんにちは。みなみんです。
C#入門シリーズの続きです。

 

今回は構造体について記事にしました。

目次

 

構造体

構造体とは

簡単に言うと、クラスとほぼ同じです。

構造体のメンバ変数やメンバ関数を定義して、その構造体に値を格納する事ができます。

 

構造体の定義

構造体の定義は「struct」キーワードを使います。
実際に構造体を定義してみました。(Gist)

使い方はクラスと全く一緒ですね。

struct [構造体の名称] {  }

クラスと構造体の違い

C言語など、非オブジェクト指向の言語はクラスという概念が無く、全て構造体で定義していたようです。

だがC++や、まさに今扱っているC#は「オブジェクト指向」なので、クラスという概念があります。

そこで、クラスと構造体の違いがよく分からないですよね。

両者の違いを次の項でまとめてみました。

 

クラスと構造体の違い

クラスのように「継承」ができない。

オブジェクト指向で最大の特徴である「継承」は構造体ではできません。出来るのはクラスだけです。

 

クラスは参照型、構造体は値型。

変数にした場合、intとかfloatとか、数値系の型はインスタンスを持たない。そして、値をそのまま代入ができる。これらは全て「値型」と呼んでいる。

一方で、クラス型とかオブジェクト型とかという、インスタンスを有する型は全て「参照型」と呼んでいる。

両者の大きな違いというのは、代入時に値・インスタンスをコピーするか、しないかの違いである。

インスタンスを有する変数は代入時、基本的にインスタンス自体のコピーは行わない。

一方で、インスタンスを有さない「値型」は代入時、値のコピーを行う。

違いを理解するために、サンプルを用意した。(Gist)

このように、値を代入する際の振る舞いが少し違う。

これが、「値型」と「参照型」の違いである。

要するに、参照型のインスタンスはコピーができずに変数が違っても、値は共通化してしまう。過去に紹介した記事での、関数の「参照渡し」みたいな現象が起こる。

 

構造体は引数のないコンストラクタ・デストラクタは定義不可。

構造体のメンバ変数は呼び出し時、自動的に全て初期化される。なので、引数なしのコンストラクタ・デストラクタは不要なんですね。

引数のあるコンストラクタの定義は可能。ただし、コンストラクタを定義する場合は、全てのメンバ変数を初期化する必要があります。そうでないと、エラーになります。

 

「静的構造体」は不可。

クラスでは「静的クラス」は可能なものの、構造体で「静的構造体」はできません。

ただし、構造体のメンバ変数の静的化は可能です。

 

 

 

この記事に誤りがあるかもしれません。その辺はご了承ください。

本記事で紹介されている方法・手法はあくまでも個人的なものです。