C# クラスと構造体のコンストラクタサンプルコード解説

概要

この資料では、C#におけるクラス(class)構造体(struct)の違いや、それぞれのコンストラクタの挙動について解説します。また、実際のコード例を通じて理解を深めます。


サンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassStructConstractorSample
{
    internal class ClassCard
    {
        public string Suit { get; set; }
        public int Number { get; set; }

        /* 必須です
        public ClassCard()
        {
            Suit = "";
            Number = 0;
        }
        */

        public ClassCard(string suit, int number)
        {
            Suit = suit;
            Number = number;
        }
    }

    internal struct StructCard
    {
        public string Suit { get; set; }
        public int Number { get; set; }

        // デフォルトコンストラクタは必須ではありません

        public StructCard(string suit, int number)
        {
            Suit = suit;
            Number = number;
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            // エラーが出るコード(デフォルトコンストラクタ)
            ClassCard card1 = new ClassCard();

            ClassCard card2 = new ClassCard("Heat", 1);

            // エラーにならないコード(デフォルトコンストラクタ)
            StructCard structCard1 = new StructCard();

            StructCard structCard2 = new StructCard("Heat", 1);
        }
    }
}

実行結果とエラーについて

このコードは一部エラーを含んでいます。

  1. ClassCard のエラー
    • ClassCard のデフォルトコンストラクタ(引数なしのコンストラクタ)は、クラスに明示的なコンストラクタが定義されている場合、自動生成されません。そのため、以下の行でエラーが発生します:
      • csharp ClassCard card1 = new ClassCard();
    • 解決方法:引数なしのコンストラクタを追加します。
      • public ClassCard() { Suit = ""; Number = 0; }
  2. StructCard のエラー
    • 構造体ではデフォルトコンストラクタは自動生成されますが、明示的に定義することはできません。そのため、以下の行は問題なく動作します:
      • csharp StructCard structCard1 = new StructCard();
    • ただし、構造体のデフォルトコンストラクタはすべてのフィールドを既定値(default)に初期化します。

クラス(class)と構造体(struct)の違い

特徴クラス (class)構造体 (struct)
型の種類参照型値型
メモリの格納場所ヒープ領域スタック領域
デフォルトコンストラクタ明示的に定義しない限り自動生成される自動生成され、すべてのフィールドを既定値に初期化
継承サポート(クラス間でのみ可能)サポートしない
パフォーマンス大きなデータや複雑なオブジェクトに適している小さなデータや単純な構造に適している

まとめ

  • クラスは参照型であり、データの共有が必要な場合や複雑なオブジェクトの操作に適しています。
  • 構造体は値型で、シンプルなデータ型の使用やパフォーマンス重視の場合に適しています。
  • クラスに明示的なコンストラクタを定義する場合は、デフォルトコンストラクタが自動生成されないことに注意が必要です。
  • 構造体ではデフォルトコンストラクタが自動的に利用可能であり、カスタマイズはできません。

補足

クラスと構造体の使い分けや注意点を理解し、適切な場面で利用することが重要です。これを応用することで、効率的で読みやすいコードを書くことができます。