C#-2

C#の基本的な文法の続きとして、特に重要で、実際のアプリケーション開発で頻繁に使用される「クラスとオブジェクト指向の基礎」について詳しく解説します。


4. クラス(Class)とオブジェクト(Object)

C#はオブジェクト指向プログラミング言語です。プログラムを「モノ(オブジェクト)」として捉え、その設計図である「クラス」を作成することで、大規模な開発でも管理しやすいコードを書きます。

📄 クラスの定義

クラスは、作成するオブジェクトの設計図です。オブジェクトが持つべき「データ(フィールド/プロパティ)」と「機能(メソッド)」を定義します。

C#

// 「Car」という名前のクラスを定義
public class Car
{
    // --- フィールド(データ)---
    public string Model;  // モデル名
    public int Speed;     // 現在の速度

    // --- メソッド(機能)---
    public void Accelerate(int value)
    {
        Speed += value;
        System.Console.WriteLine($"加速しました。現在の速度は {Speed} km/h です。");
    }
}

🚗 オブジェクト(インスタンス)の生成

クラスという設計図を使って、実際にメモリ上に具体的な「モノ」を作成することを**インスタンス化(オブジェクトの生成)**と呼びます。

C#

// Carクラスの新しいインスタンス(オブジェクト)を作成
Car myCar = new Car();

// オブジェクトのデータ(フィールド)にアクセス
myCar.Model = "プリウス";
myCar.Speed = 0;

System.Console.WriteLine($"モデル: {myCar.Model}"); // 出力: モデル: プリウス

// オブジェクトの機能(メソッド)を呼び出す
myCar.Accelerate(30);  // 出力: 加速しました。現在の速度は 30 km/h です。

5. コンストラクター(Constructor)

コンストラクターは、オブジェクトが生成されるときに自動的に実行される特別なメソッドです。初期化処理(フィールドに初期値を設定するなど)によく使われます。

コンストラクターの名前は、必ずクラス名と同じにします。

C#

public class Item
{
    public string Name;
    public int Price;

    // --- コンストラクターの定義 ---
    // オブジェクト生成時にNameとPriceを受け取り、初期化する
    public Item(string name, int price)
    {
        Name = name;
        Price = price;
        System.Console.WriteLine($"{Name}({Price}円)が作成されました。");
    }
}

// 呼び出し(オブジェクトの生成と同時に初期化が行われる)
Item apple = new Item("リンゴ", 150);
// 出力: リンゴ(150円)が作成されました。

Item book = new Item("技術書", 3000);
// 出力: 技術書(3000円)が作成されました。

6. プロパティ(Property)

プロパティは、クラスのデータを扱う際に、直接フィールドにアクセスするのではなく、安全にデータの読み書きを行うためのC#独自の仕組みです。

外部からのデータの不正な変更を防いだり、値のチェックを行う際に非常に便利です。

📘 自動実装プロパティ(Auto-Implemented Property)

初期の学習段階では、この形式が最も一般的で簡潔です。フィールドの定義とゲッター/セッターの処理をC#が自動で行ってくれます。

C#

public class Product
{
    // 自動実装プロパティの定義
    public int Id { get; set; }        // 読み書き可能(getとset)
    public string Category { get; }    // 読み取り専用(getのみ)

    public Product(int id, string category)
    {
        Id = id;
        Category = category; // コンストラクター内でのみ設定可能
    }
}

📝 プロパティを使用するメリット

setアクセサー内で、値が有効かどうか(例:年齢が0未満でないか)をチェックする処理などを記述できます。

C#

private int _age; // プライベートな裏側のフィールド

public int Age
{
    get 
    {
        return _age;
    }
    set // 値を設定するときに実行される
    {
        if (value >= 0) // 入力された値(value)が0以上かチェック
        {
            _age = value;
        }
        else
        {
            System.Console.WriteLine("エラー: 年齢は0未満に設定できません。");
        }
    }
}

C#の本格的な開発では、データを扱うほとんどの場合でフィールドではなくプロパティが使用されます。