【C#】クラス(class)の定義と基本:フィールド、プロパティ、コンストラクタ、メソッド

目次

クラスとは:オブジェクト指向の設計図

C#はオブジェクト指向プログラミング(OOP)言語であり、その中心的な概念が「クラス(class)」です。

クラスとは、特定のデータ(状態)と振る舞い(機能)を一つにまとめた「設計図」のようなものです。

  • クラス (設計図): 例: Vehicle(乗り物)
  • オブジェクト (インスタンス): 設計図に基づいて作られた「実体」(例: "Red_Sedan""Blue_Truck"

クラスを定義することで、intstringといった基本的なデータ型だけでは表現できない、複雑な「モノ」や「概念」(例: ユーザー、商品、注文)をプログラム内で独自に定義できます。


C#によるクラスの定義例

まず、クラスの定義と、それを利用するコードの全体像を示します。ここでは「乗り物」を表すVehicleクラスを例にします。

Vehicleクラスの定義

このクラスは、「乗り物のモデル名(ModelName)」「現在の速度(CurrentSpeed)」というデータと、「加速する(Accelerate)」「停止する(Brake)」という振る舞いを持ちます。

using System;

/// <summary>
/// 乗り物を表すクラス(設計図)
/// </summary>
public class Vehicle
{
    // 1. フィールド (Field)
    // クラスの内部状態を保持する変数。通常 'private' にする。
    private int _currentSpeed;

    // 2. プロパティ (Property)
    // 外部に公開するデータ(フィールドへのアクセスを制御する)
    public string ModelName { get; private set; } // 読み取り専用(設定はクラス内部のみ)
    public string Color { get; set; }         // 読み書き可能

    // 3. コンストラクタ (Constructor)
    // 'new' キーワードでオブジェクトが生成される瞬間に呼び出されるメソッド。
    // オブジェクトの初期化を行う。
    public Vehicle(string model, string color)
    {
        this.ModelName = model;
        this.Color = color;
        this._currentSpeed = 0; // 速度は 0 で初期化
    }

    // 4. メソッド (Method)
    // オブジェクトの振る舞い(アクション)を定義する。

    /// <summary>
    /// 指定した量だけ加速する
    /// </summary>
    public void Accelerate(int amount)
    {
        if (amount > 0)
        {
            this._currentSpeed += amount;
            Console.WriteLine($"{this.ModelName} が {this._currentSpeed} km/h に加速しました。");
        }
    }

    /// <summary>
    /// 速度を 0 にする
    /// </summary>
    public void Brake()
    {
        this._currentSpeed = 0;
        Console.WriteLine($"{this.ModelName} が停止しました。");
    }
}

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

classは設計図にすぎません。newキーワードを使ってクラスのコンストラクタを呼び出すことで、初めて「オブジェクト(インスタンス)」として実体化され、使用できるようになります。

using System;

public class Program
{
    public static void Main()
    {
        // 1. 'Vehicle' クラス(設計図)から、'myCar' オブジェクト(実体)を生成
        // "new" を呼び出すと、コンストラクタが実行される
        var myCar = new Vehicle("Sedan-X100", "Blue");

        // 2. プロパティの読み書き
        Console.WriteLine($"作成されたモデル: {myCar.ModelName}");
        Console.WriteLine($"元の色: {myCar.Color}");
        
        myCar.Color = "Red"; // Color プロパティは書き換え可能
        Console.WriteLine($"新しい色: {myCar.Color}");

        // 3. メソッドの呼び出し
        myCar.Accelerate(50);
        myCar.Accelerate(20);
        
        myCar.Brake();
    }
}

出力結果:

作成されたモデル: Sedan-X100
元の色: Blue
新しい色: Red
Sedan-X100 が 50 km/h に加速しました。
Sedan-X100 が 70 km/h に加速しました。
Sedan-X100 が停止しました。

1. フィールド (Field)

フィールドは、クラスの内部状態を保持するために使用される変数です。

慣例として、フィールドはprivate(そのクラスの内部からのみアクセス可能)として宣言され、変数名の先頭にはアンダースコア(_)が付けられます(例: _currentSpeed)。

privateにすることで、外部から勝手にmyCar._currentSpeed = -100のように不正な値を書き込まれることを防ぎます。これを「カプセル化」と呼びます。


2. プロパティ (Property)

プロパティは、privateなフィールドに対する「公開窓口(ゲート)」の役割を果たします。{ get; set; }という構文で定義されます。

  • get: プロパティの値を読み取るときに実行されます。
  • set: プロパティに値を書き込むときに実行されます。
// (例1) 自動実装プロパティ
// 内部にコンパイラが自動でフィールド(バックアップフィールド)を作成する
public string Color { get; set; } // 読み書き可能

// (例2) 読み取り専用プロパティ
public string ModelName { get; private set; }
// 'get' は public (誰でも読める)
// 'set' は private (クラス内部のコンストラクタやメソッドからのみ書き込める)

// (例3) 独自のロジックを持つプロパティ
// _currentSpeed フィールド(実体)に紐づく
public int CurrentSpeed
{
    get { return _currentSpeed; }
    // 'set' を定義しないことで、外部からの書き込みを禁止している (読み取り専用)
}

3. コンストラクタ (Constructor)

コンストラクタは、newキーワードでオブジェクトが生成されるときに一度だけ呼び出される、特別なメソッドです。

  • クラス名と同じ名前で定義します。
  • 戻り値(voidなど)は記述しません。

コンストラクタの主な役割は、オブジェクトが使用可能になる前に、必要な初期値(例: ModelName)をフィールドやプロパティに確実に設定することです。

// Vehicle クラスのコンストラクタ
public Vehicle(string model, string color)
{
    // 引数で受け取った値を、プロパティやフィールドに設定する
    this.ModelName = model;
    this.Color = color;
    this._currentSpeed = 0; // 速度は 0 で初期化
}

4. メソッド (Method)

メソッドは、そのオブジェクトが実行できる「振る舞い」や「アクション」を定義する関数です。Vehicleクラスの例では、Accelerate()(加速する)やBrake()(停止する)がメソッドにあたります。

メソッドは、_currentSpeedのようなprivateなフィールドの値を、決められたルール(Accelerateなら増やす、Brakeなら0にする)に従って安全に変更する役割も担います。

// 振る舞い(メソッド)
public void Accelerate(int amount)
{
    if (amount > 0)
    {
        _currentSpeed += amount; // 内部のフィールドを操作
    }
}

まとめ

クラスは、C#におけるデータ構造の基本です。

  • フィールド: privateな内部データ。
  • プロパティ: データを外部に公開する窓口(カプセル化)。
  • コンストラクタ: new 時に呼ばれる初期化処理。
  • メソッド: オブジェクトが行う動作。

これら4つの要素をclassとして正しく設計することで、データとそのデータを操作するロジックを一つにまとめ、管理しやすく堅牢なプログラムを構築できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次