2016年5月26日木曜日

[C#] struct(構造体)

こんにちは。明月です。
今日はstruct(構造体)について勉強します。


struct


「struct」の意味的には「class(クラス)」と同じですね。すなわち、データを縛る最小単位です。
そうするとなぜ「class」と「struct」にキーワードを分けただろうかと言えばメモリ参照方法の差があります。
「class」の場合は外部でメモリに割り当ててメモリ参照タイプとして使いますが、「struct」の場合は宣言する時に「struct」内部でメモリに割り当てて値タイプとして使うの差があります。



上の例をみるとクラスの場合は「Aclass」を宣言して「new」キーワードで割り当てます。
そして「Aclass」の変数「data」に「10」の値を格納します。その後で「Bclass」を宣言して「Aclass」をメモリアドレスを代入します。
その後で「Bclass」の変数「data」に「15」の値を格納すると「Aclass」の変数「data」の値はどうでしょうか?


前のクラスの投稿にも説明しましたが、上の場合は「Aclass」と「Bclass」が同じクラスを参照しているので両方「15」の値を持っていることを知っています。


[C#] クラス(class)とコンストラクタ、そしてnew(割り当て)


そうすると「Astruct」と「Bstruct」も同じパタンを考えれば両方の変数「data」が「15」になると思われますね。



結果を見れば予想結果と違いますね。結果を見ると「Aclass」と「Bclass」は確かに同じメモリアドレスを入っていますが、「Astruct」と「Bstruct」の場合はメモリアドレスが違いますね。
すなわち「TestStruct Bstruct」を宣言する時に内部でメモリに割り当てて後「Bstruct」に「Astruct」の値をコピーしたと意味になります。


そしたらこれから「struct」の使用方法について勉強してみましょう。



とりあえず、上の構造を見ると「struct」もコンストラクタがあります。構造体の場合もコンストラクタを呼び出すためには「new」キーワードを使います。その場合は内部からメモリが割り当てることではなく、クラスみたいに外部からメモリが割り当てます。


また、継承について勉強する前ですが、構造体はstructから継承ができません。(それで、プロパティを使いません。)
でも、インタフェースからは継承をできますね。この部分は継承とインタフェースを勉強するときに詳しく話しましょう。
「struct」の構成はメンバ変数とメソッドだけありますね。すなわち、クラスのイベント、プロパティは使えません。(「使いません」という意味は「できません」という意味と違います。クラスみたいにすべての構成を作成はできますけど、そうすると構造体の特徴がなくなります。)


構造体(struct)を纏めると下記とおりです。


  • 宣言する時に自動で内部割り当てをします。
  • 宣言する時にメンバ変数のデータを入れないとエラーになります。
  • 構造体は基本的にOOPの概念と違うのでイベント、プロパティは使いません。
  • 参照形式ではなく、値形式で構成しています。
  • heapの宣言をすることではないので、「GC」から消滅されることではなく一般変数と同じサイクルを持ってブロックが終わると消滅されます。

0 件のコメント