C# - 構造体(struct)について -
初めに
C# で使う構造体について、学んだことをまとめます。
構造体とは
複数の変数や関数をまとめて管理するためのものです。次のように struct で定義されます。
[修飾子] struct 構造体名
{
フィールド(メンバ変数);
}
最も簡単な例
void Start() { //代入 Data data; data.id = 6; data.name = "perfect"; //CheckDataの呼び出し CheckData(da); } //関数の定義, 引数は Data 型 private CheckData(Data da) { Debug.Log($"id:{da.id}, name:{da.name}"); } //構造体 public struct Data { public int id; public string name; }
一番下で Data という構造体を定義しています。Start を見ると構造体内の変数へのアクセスの仕方や代入の仕方が分かります。
また、関数の引数として構造体の型を使うことができます。構造体を使うことで引数の記述が楽になります。
(補足)
$ は文字列補間式と呼ばれるものです。先頭に $ の記号を追加し、式を中括弧で囲むことで、文字列内に式を埋め込むことができます。
構造体内に関数を書く
構造体の中に関数を書くこともできます。
void Start() { //代入 Data data; data.id = 6; data.name = "perfect"; Debug.Log(data.DataString()); } //構造体 public struct Data { public int id; public string name; //構造体内の関数, string を返す public string DataString() { return $"id:{da.id}, name:{da.name}"; } }
コンストラクタ
コンストラクタとは
インスタンスを作ったタイミングで実行されるメソッドのこと
new で呼ばれる関数
のことです。
(例)
Vecter3 vec = new Vector3(1.0f, 2.0f, 3.0f);
構造体でもコンストラクタを作ることができます。
void Start() { //代入 Data data = new Data(1, namae) } //構造体 public struct Data { public int id; public string name; //コンストラクタの定義 public Data(int id, string name) { this.id = id; this.name = name; } }
構造体同士の比較
構造体が等しいことは "Equals" 関数で判定します。"==" はデフォルトでは使えないため、気をつけましょう。
public class StructScript : MonoBehaviour { void Start() { //代入 Data data_a = new Data(1, "namae"); Data data_b = new Data(1, "namae"); if(Equals(data_a, data_b)) { Debug.Log("コンストラクタが同じ"); } } //構造体 public struct Data { public int id; public string name; //コンストラクタの定義 public Data(int id, string name) { this.id = id; this.name = name; } } }
構造体とクラスの違い
構造体とクラスは共通点は多いですが、型の違いに起因する違いがあります。
構造体 | クラス | |
---|---|---|
オブジェクトの型 | 値型 | 参照型 |
値型のほうが参照型より制限がつよいため、構造体のほうが制限が強いです。その代わり、構造体のほうがクラスより処理が軽いようです。値型、参照型については、別で記事にします。
最後に
構造体についてまとめました。構造体を使わなくても問題はないですが、選択肢として持っているときれいにプログラムが書ける場面もあるかと思います。