C#_構造体とは

関連性のあるデータをひとくくりにして名前を付け、にしたもの。

struct hoga
{
    int itemA;
    double itemB;
    char itemC[10]; 
}

 

J ava はC ++をベースに設計された。

C ++ のいらん部分をばっさり捨てたのがJavaの長所。

Jav aが切り捨てた中に構造体がある。
Java が構造体を切り捨てたのは、
クラスにメンバを定義するのと同じだから、という理由。

構造体の機能はクラスに内包することが可能
不要であるように見えるが、
C ++ は C の上位互換言語としての役割を担っていた為、
切り捨てられない
切り捨てると、C のソースが使い物にならなくなる。

 

C # は C ++ をベースに設計された。

やはり構造体も継承している。

----クラスと構造体の相違点----

1.クラスは参照型、構造体は値型
     よって、代入を行うと参照(ポインタ)ではなく、値がコピーされる。

2.クラスは継承をサポートしているが、
     構造体は暗黙的にsealedであり、継承することができない

3.クラスにはデストラクタを定義できるが、
     構造体にはデストラクタを定義できない

4.クラスでは、パラメータのないカスタムコンストラクタを定義できるが、
     構造体は既に定義されている。

 

4.について。

クラス定義では、以下のように既定のコンストラクタをユーザが定義し、
メンバ フィールドの初期化を自由に行える。

 class cCLASS
{
    public int itemA;
    public string itemB;
   
    public cCLASS( )
    {
        itemA = 5;
        itemB = "five";
    }
}

 

だが、構造体で行おうとすると、
以下のようなコンパイルエラーがでる。 

構造体に明示的なパラメータのないコンストラクタを含めることはできません

どういう意味かというと、

各構造体には、オブジェクトをゼロに初期化する既定
コンストラクタが既にある
したがって、
構造体に対して作成するコンストラクタでは 1 以上
パラメータを受け取る必要がある

つまり、
構造体のインスタンス作成時に、各メンバ フィールドに対して初期値以外の
何らかの値を設定したい場合は、以下のようにしなくてはならない。

struct sSTRUCT
{
    public int itemA;
    public string itemB;
   
    public sSTRUCT(int a, string b)
    {
        itemA = a;
        itemB = b;
    }
}

sSTRUCT s = new sSTRUCT(5, "Five");

 ※  C# 6 = Visual Studio 2015 で構造体の引数なしコンストラクタが
      可能になったようだが、結局見送られたらしい。

 

構造体が必要なわけ

クラスも、構造体も、
メンバ フィールドは定義できるし、メソッドも定義できる。
インターフェースだって実装可能。

C # にはC ++と違い、継承すべき言語もない。
構造体いらないじゃん。
だが、
構造体が存在しなければならない時が 1 つだけある。

Windows API や COM など、
Windowsネイティブのアンマネージドライブラリを呼び出す時
これらのモジュールはC / C ++ で作成されており、
パラメータに構造体を数多く含んでいる。

 

 

こちら参照。
http://blog.xin9le.net/entry/2015/03/02/131247
http://ufcpp.net/study/csharp/cheatsheet/listfxlangversion/
他、C ++の書籍。

 

以上。