【C#】クラスとは?図解とサンプルコード付きで徹底解説!

悩んでる人

C#のクラスって何なの?設計図って言われてもよくわからない

悩んでる人

型とかスコープとか用語が多すぎて混乱する!

C#を学ぶ上で、クラスは避けて通れない最重要テーマのひとつです。

「設計図」と言われても、なかなかピンとこない方は多いはず。

本記事では、C#のクラスの基礎から実践的な使い方まで、サンプルコードつきでわかりやすく解説します。

この記事でわかること
  • C#のクラスとは何かがイメージ図でわかる
  • インスタンスの生成・コンストラクタの書き方
  • フィールド・プロパティ・メソッドの役割
  • アクセス修飾子(public / private)の違い
  • 継承とオーバーライドの基本
この記事を書いた人
  • システムエンジニア10年目
  • 会社員3年⇒フリーランス7年目
  • 保険系 / 物流系 / 鉄道系 / 小売系などのシステム開発に従事
  • プログラミング講師
目次

C#のクラスとは何か?

C#のクラスとは、インスタンスを作るための「設計図」のようなものです。

車の設計図をもとに、赤い車・青い車・白い車が作れるように、1つのクラスから何個でもインスタンスが生成できます。

おしけん

「クラス=設計図、インスタンス=設計図から作った実物」と覚えれば、ほぼOKです!

クラスはデータ(フィールド・プロパティ)と処理(メソッド)をひとまとめにして定義します。

これが、オブジェクト指向プログラミングの基本的な考え方です。

C#のクラスの基本的な書き方

クラスはキーワード class に続けてクラス名を書き、{ } の中に定義を書きます。

クラス名は先頭大文字のパスカルケースにするのが、C#の慣習です。

// クラスの基本的な書き方
public class Car
{
    // フィールド(データを格納する変数)
    public string Color;
    public int Speed;

    // メソッド(処理を定義)
    public void Run()
    {
        Console.WriteLine($"{Color}の車が{Speed}km/hで走っています");
    }
}

クラスを定義しただけでは、まだ使えません。

実際に使うためには、new キーワードでインスタンス(実体)を生成する必要があります。

// new でインスタンスを生成
Car car1 = new Car();
car1.Color = "赤";
car1.Speed = 100;
car1.Run(); // 赤の車が100km/hで走っています

Car car2 = new Car();
car2.Color = "青";
car2.Speed = 80;
car2.Run(); // 青の車が80km/hで走っています
ポイント

Car car1 = new Car(); の左側はデータ型(クラス名)、右側がインスタンス生成です。
car1 と car2 はそれぞれ独立したオブジェクトとして動作します。

コンストラクタの使い方

コンストラクタとは、インスタンスが生成されたときに自動的に呼ばれる特別なメソッドです。

初期値の設定など、オブジェクトの準備処理をここに書きます。

悩んでる人

コンストラクタって普通のメソッドと何が違うの?

おしけん

クラス名と同じ名前で、戻り値の型を書かない点が大きな違いです!new したタイミングで自動実行されます。

public class Car
{
    public string Color;
    public int Speed;

    // コンストラクタ(クラス名と同じ名前・戻り値なし)
    public Car(string color, int speed)
    {
        this.Color = color;  // this = このインスタンス自身
        this.Speed = speed;
    }

    public void Run()
    {
        Console.WriteLine($"{Color}の車が{Speed}km/hで走っています");
    }
}
// コンストラクタに引数を渡してインスタンス生成
Car car1 = new Car("赤", 100);
car1.Run(); // 赤の車が100km/hで走っています
ポイント

コンストラクタは引数の違いで複数定義できます(オーバーロード)。

引数なしのコンストラクタを定義しておくと、new Car() でも生成できます。

フィールドとプロパティの違い

フィールドはクラス内の変数で、データを保持する役割を持ちます。

一方、プロパティは get / set を使ってアクセスを制御できるため、実務ではプロパティが推奨されます。

public class Car
{
    // フィールド(private にして外部から直接アクセスさせない)
    private string _color;
    private int _speed;

    // プロパティ(get/set でアクセスを制御)
    public string Color
    {
        get { return _color; }
        set
        {
            // バリデーション:空文字は許可しない
            if (!string.IsNullOrEmpty(value))
                _color = value;
        }
    }

    // 自動実装プロパティ(シンプルな書き方)
    public int Speed { get; set; }
}
種類外部
アクセス
バリデーション実務での使用
フィールド (public)
(直接)
不可△ あまり推奨されない
プロパティ
(get/set)
◎ 推奨
フィールド (private)不可◎ プロパティと組み合わせる

C#のメソッドの定義と呼び出し方

メソッドはクラスに定義する「処理のまとまり」です。

戻り値がない場合は void、値を返す場合は戻り値の型(intstring など)を指定します。

public class Car
{
    public string Color { get; set; }
    public int Speed { get; set; }

    // 戻り値なし(void)のメソッド
    public void Run()
    {
        Console.WriteLine($"{Color}の車が{Speed}km/hで走っています");
    }

    // 戻り値あり(string を返す)のメソッド
    public string GetInfo()
    {
        return $"色:{Color}、速度:{Speed}km/h";
    }

    // 引数ありのメソッド
    public void Accelerate(int addSpeed)
    {
        Speed += addSpeed;
        Console.WriteLine($"加速しました。現在の速度:{Speed}km/h");
    }
}
おしけん

「処理を実行するだけなら void、何か値を返したいなら戻り値の型を指定する」と覚えておきましょう!

アクセス修飾子(public / private)

アクセス修飾子は、クラスのメンバーへのアクセス範囲を制限するキーワードです。

外部に公開すべきものは public、内部だけで使うものは private にするのが基本です。

public class BankAccount
{
    // private:外部から直接変更させない
    private int _balance = 0;

    // public:残高を確認する(読み取りのみ)
    public int Balance { get { return _balance; } }

    // public:入金メソッド(金額チェックつき)
    public void Deposit(int amount)
    {
        if (amount > 0)
            _balance += amount;
    }

    // public:出金メソッド(残高チェックつき)
    public bool Withdraw(int amount)
    {
        if (amount > 0 && amount <= _balance)
        {
            _balance -= amount;
            return true;
        }
        return false;
    }
}
⚠️ 注意

フィールドをすべて public にすると、外部から不正な値が代入されるリスクがあります。

フィールドは private、公開用には public なプロパティやメソッドを用意するのが安全です。

継承の基本

継承とは、既存のクラス(基底クラス)の機能を引き継いで、新しいクラス(派生クラス)を作ることです。

共通の処理を基底クラスにまとめることで、コードの重複を減らせます

// 基底クラス(親クラス)
public class Vehicle
{
    public string Color { get; set; }
    public int Speed { get; set; }

    public virtual void Run()
    {
        Console.WriteLine($"{Color}の乗り物が走っています");
    }
}

// 派生クラス(: Vehicle で継承)
public class Car : Vehicle
{
    public int DoorCount { get; set; }

    // override でメソッドを上書き
    public override void Run()
    {
        Console.WriteLine($"{Color}の車({DoorCount}ドア)が走っています");
    }
}

// 利用例
Car car = new Car() { Color = "赤", Speed = 100, DoorCount = 4 };
car.Run(); // 赤の車(4ドア)が走っています
おしけん

基底クラスのメソッドを子クラスで上書きすることを「オーバーライド」と言います。基底クラスのメソッドに virtual、派生クラスに override をつければOKです!

ポイント

base.Run() を呼ぶと、基底クラスの元の処理も実行できます。
継承は「共通の機能を親にまとめ、個別の機能は子に追加する」という設計思想です。

まとめ

  • クラスはオブジェクトを作るための「設計図」。new でインスタンス(実体)を生成する
  • コンストラクタは new したときに自動で呼ばれる初期化メソッド
  • フィールドはデータの格納、プロパティは get/set でアクセス制御ができる(実務はプロパティ推奨)
  • メソッドは処理をまとめたもの。戻り値がなければ void、あれば型を指定する
  • アクセス修飾子で公開範囲を制御。フィールドは private、公開部分は public が基本
  • 継承で既存クラスの機能を引き継いで新しいクラスを作れる(virtual + override
おしけん

クラスは最初は難しく感じますが、実際にコードを書いて動かすうちに必ず慣れてきます!まずは簡単なクラスを自分で作ってみることが一番の近道ですよ!

C#のクラスをマスターすると、オブジェクト指向プログラミングの世界が広がります。

次のステップとして、インターフェースや抽象クラスにも挑戦してみましょう!

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