C# のストラクトを、私なりの考え方でまとめてみました。
ここでも、前回同様に複数の変数やメソッドから構成されるデータを取り扱います。内容としては、社員を管理するデータです。
1. 次のようなストラクトを作成します。 これは社員 ID と社員名を管理でき、さらに社員情報を取得できるメソッドをもっています。
public struct stEMP { public string sID; public string sName; public string Get_EMP() { return sID + " " + sName; } }
2. このストラクトを使って複数の社員を管理してみます。コードは次のようになります。 emp1 と emp2 の社員の変数を作って、それぞれのストラクト変数とメソッドを取り扱います。
private void button1_Click(object sender, EventArgs e) { stEMP emp1; emp1.sID = "01"; emp1.sName = "Yamada"; MessageBox.Show(emp1.Get_EMP()); stEMP emp2; emp2.sID = "02"; emp2.sName = "Tanaka"; MessageBox.Show(emp2.Get_EMP()); }
これは前回クラスで実現できたこととまったく同じ結果になります。違いは次の 2 点です。
・class ではなく、struct キーワードを使っています。
・emp1, emp2 の変数を作成する際に、new キーワードは使用していません。
クラスを使って、変数やメソッドを扱う場合に、なぜわざわざ new しなくてはいけないのか疑問でした。これまではクラスとはそういうものだと考えていましたので、おまじない的に使っていました。
しかし、ストラクトと同時に考えると、その疑問がなんとなく解決されました。そのカギとなるキーワードが参照型と値型です。端的に言うと、クラスは参照型で、ストラクトは値型です。その違いにより new するかしないかということに繋がります。
参照型は変数の内容を扱う際には、そのアドレスで扱います。値型は値そのものを扱います。サイズの大きなデータを扱う場合には、そのアドレスを扱った方が効率的です。反対に小さなデータを扱う場合には、わざわざアドレスを扱うよりは直接値を扱った方が効率的です。この違いによって、参照型か値型かを使い分けることが必要です。
C# でのオブジェクト指向でデータを扱う場合、参照型で扱う場合にはクラスを、値型で扱う場合にはストラクトが用意されていると考えられます。
これで、やっとクラスを扱うときに new しなければならない理由が分かりました。端的に言うと、new したくなければ、ストラクトを使えばいいのです。もちろん、実行効率を考えずに単に new したくないというのは NG ですが...
最後に、実はストラクトで変数を作成する場合でも、new を書くことができます。しかし、int x1 = new int(); も書けることと同じだと思います。このあたりは私自身まだ疑問が残るところです。
もちろん、上記の考え方は、正式には正しくないかもしれません。しかし、自分が理解するうえでは分かりやすい考えか方だと思っています。