C#構造体(struct)完全ガイド:定義、活用、クラスとの違い
C#構造体(struct)
C#構造体の定義、インスタンス化、コンストラクタ、プロパティ、そしてクラスとの決定的な違いまでを実例とともに解説します。
C#において構造体(struct)はクラスと似ていますが、値型である点が根本的に異なります。つまり、参照ではなくデータを直接格納します。
人の名前と年齢を格納したいとします。name と age という2つの変数を用意して値を入れられます。
しかし、複数人の情報を保持する必要がある場合、毎回別々の変数を宣言するのは面倒です。name と age を含む構造体を定義すれば、同じレイアウトを全員分再利用できます。
C#で構造体を定義する
C#では struct キーワードで構造体を宣言します。例:
struct Employee {
public int id;
}
ここでは id が構造体内のフィールドです。構造体にはメソッド、インデクサーなども含められます。
構造体変数の宣言
構造体を使う前に、その型の変数を作成する必要があります。構文は:
struct Employee {
public int id;
}
// Employee型の変数empを宣言
Employee emp;
この例では Employee という構造体を定義し、その型の変数 emp を宣言しています。
C#構造体へのアクセス
構造体メンバーにはドット(.)演算子でアクセスします:
Employee emp;
emp.id = 1;
これにより Employee 構造体の id フィールドに値 1 を代入します。
int, bool, float などのプリミティブ型は、C#では事前定義された構造体です。実例: C#構造体
using System;
namespace CsharpStruct {
// 構造体定義
struct Employee {
public int id;
public void GetId(int id) {
Console.WriteLine("Employee Id: " + id);
}
}
class Program {
static void Main(string[] args) {
// Employee型の変数empを宣言
Employee emp;
// フィールドにアクセスして設定
emp.id = 1;
// メソッド呼び出し
emp.GetId(emp.id);
Console.ReadLine();
}
}
}
出力
Employee Id: 1
このプログラムは Employee 構造体を作成し、id フィールドを設定し、GetId メソッドで表示しています。
new キーワードでインスタンス化することも可能です:
Employee emp = new Employee();
これはパラメータなしコンストラクタを呼び出し、すべてのフィールドを既定値で初期化します。
C#構造体のコンストラクタ
構造体でもコンストラクタを定義してフィールドを初期化できます。例:
struct Employee {
public int id;
// コンストラクタ
public Employee(int employeeId) {
id = employeeId;
}
}
注意: C# 10 より前では、構造体にパラメータなしコンストラクタを定義できません。
実例: 構造体のコンストラクタ
using System;
namespace CsharpStruct {
struct Employee {
public int id;
public string name;
// パラメータ付きコンストラクタ
public Employee(int employeeId, string employeeName) {
id = employeeId;
name = employeeName;
}
}
class Program {
static void Main(string[] args) {
// コンストラクタ呼び出し
Employee emp = new Employee(1, "Brian");
Console.WriteLine("Employee Name: " + emp.name);
Console.WriteLine("Employee Id: " + emp.id);
Console.ReadLine();
}
}
}
出力
Employee Name: Brian Employee Id: 1
この例ではコンストラクタですべてのフィールドに値を代入しています。すべてのフィールドを初期化しないとコンパイルエラーになります。
C#構造体のプロパティ
構造体でもプロパティを公開してカプセル化できます。例:
using System;
namespace CsharpStruct {
struct Employee {
public int id;
// プロパティ
public int Id {
get { return id; }
set { id = value; }
}
}
class Program {
static void Main(string[] args) {
Employee emp = new Employee();
emp.Id = 1;
Console.WriteLine("Employee Id: " + emp.Id);
Console.ReadLine();
}
}
}
出力
Employee Id: 1
ここでは Id プロパティが id フィールドへの制御付きアクセスを提供しています。
クラスと構造体の違い
クラスと構造体は構文が似ていますが、根本的に異なります:
- クラスは参照型、構造体は値型
- クラスインスタンスの代入は参照コピー(両変数が同一オブジェクトを指す)。構造体の代入は値全体のコピー
- 構造体は継承をサポートしないが、クラスはサポートする
クラスの参照動作の例:
using System;
namespace CsharpStruct {
class Employee {
public string name;
}
class Program {
static void Main(string[] args) {
Employee emp1 = new Employee();
emp1.name = "John";
Employee emp2 = emp1;
emp2.name = "Ed";
Console.WriteLine("Employee1 name: " + emp1.name);
Console.ReadLine();
}
}
}
出力
Employee1 name: Ed
構造体の値動作の例:
using System;
namespace CsharpStruct {
struct Employee {
public string name;
}
class Program {
static void Main(string[] args) {
Employee emp1 = new Employee();
emp1.name = "John";
Employee emp2 = emp1;
emp2.name = "Ed";
Console.WriteLine("Employee1 name: " + emp1.name);
Console.ReadLine();
}
}
}
出力
Employee1 name: John
構造体の例では、emp2 は emp1 のコピーを受け取るため、emp2 の変更が emp1 に影響しません。
これらの違いにより、構造体は小さく、不変なデータ構造で、スタック割り当てと値セマンティクスの恩恵を受けたい場合に最適です。
C言語
- 従業員スケジューリングのモダナイズで定着率と生産性を向上させる理由
- 職場の安全強化:定期的な従業員バックグラウンド再チェックが重要な理由
- COVID-19下で従業員エンゲージメントを強化する4つの実証済み戦略
- DVIRC、Alan Shellをリーン/CIサービスディレクターに昇進、新メンバー3名を迎える
- 職場安全の向上:製造ロボティクスが従業員をどう守るか
- 未来の仕事で先を行く:競争に勝つ戦略
- 従業員生産性分析:IoT時代のインサイト解放
- C言語 構造体 完全マスター: 定義・変数・アクセス・高度な例
- C言語 構造体とポインタ: 実践ガイド
- C言語 構造体: 関数への渡し方・返し方・参照渡しをマスター
- C++構造体を実例で徹底解説