C#でstaticクラスと通常クラスの違いを理解しよう

C#では、staticクラスという特別なクラスを作成することができます。staticメソッドを持つ通常のクラスとはどう違うのか、わかりやすく説明します。


1. staticクラスとは?

  • 完全に静的なクラスのことです。
  • 全てのメンバー(フィールド、プロパティ、メソッド)がstaticでなければなりません。
  • インスタンスを作成できません

例: staticクラスの定義

static class MathUtils
{
    public static int Add(int a, int b)
    {
        return a + b;
    }

    public static int Multiply(int a, int b)
    {
        return a * b;
    }
}

// 呼び出し例
int sum = MathUtils.Add(3, 5); // 結果: 8
int product = MathUtils.Multiply(3, 5); // 結果: 15

ポイント:

  • MathUtilsstaticクラスなので、new MathUtils()のようにインスタンスを作成することはできません。

2. 通常クラスとstaticクラスの違い

特徴通常クラスstaticクラス
インスタンス作成可能不可能
メンバーstaticメンバーとインスタンスメンバーを持てる全てのメンバーがstatic
目的インスタンスごとのデータや動作を管理する共有データやユーティリティ機能を提供する
継承他のクラスを継承したり、継承元になることが可能継承できない

通常クラスの例

通常のクラスは、インスタンスを作成して使用します。また、staticメソッドとインスタンスメソッドの両方を持つことができます。

class MyClass
{
    public int InstanceValue { get; set; } // インスタンスフィールド

    public static string StaticValue = "共有データ"; // 静的フィールド

    public void InstanceMethod()
    {
        Console.WriteLine($"インスタンス値: {InstanceValue}");
    }

    public static void StaticMethod()
    {
        Console.WriteLine($"静的値: {StaticValue}");
    }
}

// 呼び出し例
MyClass obj = new MyClass();
obj.InstanceValue = 42;
obj.InstanceMethod(); // インスタンスメソッド呼び出し

MyClass.StaticMethod(); // 静的メソッド呼び出し

3. staticクラスを使うべき場面

3.1 ユーティリティクラス

  • インスタンスを作る必要がない処理をまとめる場合に適しています。
  • 例: 数学的な計算、文字列操作、設定管理など。
static class StringUtils
{
    public static string ToUppercase(string input)
    {
        return input.ToUpper();
    }
}

3.2 クラス全体で共有するデータやロジック

  • 例えば、アプリケーション全体で使われるログ機能。
static class Logger
{
    public static void Log(string message)
    {
        Console.WriteLine($"[LOG]: {message}");
    }
}

4. 通常クラスとstaticクラスの使い分け

使いたいケース選ぶべきクラス
インスタンスごとに異なるデータを管理する通常クラス
インスタンスを作らず共通の機能を提供するstaticクラス
一部のメソッドだけをstaticにしたい通常クラス

具体例: 数学的な処理を提供する場合

staticクラスを使う場合

static class MathUtils
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

通常クラスを使う場合

class Calculator
{
    private int lastResult;

    public int Add(int a, int b)
    {
        lastResult = a + b; // インスタンスごとに結果を記録
        return lastResult;
    }
}

ポイント:

  • MathUtilsは常に同じ計算ロジックを提供します。
  • Calculatorはインスタンスごとに計算履歴を管理します。

5. まとめ

  • staticクラス
    • 完全に静的なクラス。
    • インスタンスを作らずに機能を提供する。
    • 主にユーティリティや共有機能に適している。
  • 通常クラス
    • 静的メソッドとインスタンスメソッドを組み合わせて使用可能。
    • インスタンスごとのデータを管理したい場合に使用。

staticクラスは「インスタンスを必要としない便利な機能を提供する道具箱」、通常クラスは「インスタンスごとに異なるデータや動作を管理するもの」として使い分けましょう!