【C#】静的メンバー(static)の使いどころ

C# ではクラスのメンバーを static として定義すると、インスタンスを生成しなくても利用できる「静的メンバー」になります。静的メンバーは共通の値や処理を扱いたいときに便利ですが、使い方を誤ると柔軟性を失うこともあります。本記事では static の基本と使いどころを解説します。

staticメンバーとは?

通常のメンバー(インスタンスメンバー)はオブジェクトごとに独立した値を持ちますが、static を付けるとすべてのインスタンスで共有されます。メソッドやプロパティ、フィールドに適用可能です。

class Counter
{
    public static int Count = 0; // 静的フィールド

    public Counter()
    {
        Count++;
    }
}

class Program
{
    static void Main()
    {
        new Counter();
        new Counter();
        Console.WriteLine(Counter.Count); // 2
    }
}

この例ではインスタンスを 2 回生成していますが、Count はクラス全体で共有されているため「2」と表示されます。

staticメソッド

static を付けたメソッドはインスタンスを作らずに呼び出せます。代表例は Math クラスのメソッドです。

Console.WriteLine(Math.Sqrt(16));  // 4
Console.WriteLine(Math.Max(3, 7)); // 7

このようにユーティリティ的な処理は static メソッドにすることでシンプルに利用できます。

staticプロパティ

プロパティにも static を付けられます。例えばアプリ全体で共通する設定値などに利用します。

class AppConfig
{
    public static string ApplicationName { get; set; } = "MyApp";
}

class Program
{
    static void Main()
    {
        Console.WriteLine(AppConfig.ApplicationName); // MyApp
    }
}

staticクラス

クラス自体を static にすると、すべてのメンバーが静的になり、インスタンス化できなくなります。ユーティリティクラスに適しています。

static class StringHelper
{
    public static string ToSnakeCase(string input)
    {
        return input.Replace(" ", "_").ToLower();
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(StringHelper.ToSnakeCase("Hello World")); // hello_world
    }
}

staticの使いどころ

  • ユーティリティ処理 … 文字列処理や数学関数など、状態を持たない汎用的な処理
  • 共通の設定値や定数 … アプリ全体で利用する定数や設定値
  • 状態を共有するカウンタやキャッシュ … すべてのインスタンスで同じ値を参照したい場合

注意点

静的メンバーは便利ですが、多用するとオブジェクト指向の柔軟性を損なうことがあります。また、マルチスレッド環境では静的フィールドの共有による競合に注意が必要です。

まとめ

C# の static は「インスタンスを作らなくても使える共通メンバー」を定義する仕組みです。ユーティリティ処理や共通の設定値に適しており、正しく使えばコードを簡潔かつ効率的に書けます。ただし過度に依存すると拡張性を失うため、使いどころを意識して活用しましょう。