静的クラスとは:newできないクラス
C#のクラスは通常、newキーワードを使ってインスタンス(オブジェクト)を生成してから使用します。しかし、数学関数(System.Math)やコンソール操作(System.Console)のように、データを保持せず、機能(メソッド)だけを提供したい場合、いちいちインスタンスを生成するのは非効率であり、コードの可読性も下がります。
このような場合に利用されるのが「静的クラス(static class)」です。
静的クラスは、クラスの宣言に static キーワードを付けることで定義され、以下の特徴を持ちます。
- インスタンス化できない:
new MyClass()と書くとコンパイルエラーになります。 - 静的メンバーのみを含む: クラス内部のすべてのメソッド、プロパティ、フィールドにも
staticを付ける必要があります。 - クラス名から直接呼び出す: 機能を利用する際は
MyClass.Method()のように記述します。
この記事では、消費税計算を行うユーティリティクラスを例に、静的クラスの定義と使用方法を解説します。
静的クラスの定義
静的クラスを定義するには、classキーワードの前にstaticを記述します。
コード例:消費税計算ユーティリティ
ここでは、消費税率を管理し、税込価格や税額を計算する TaxCalculator クラスを作成します。
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
// 日本円の通貨表示設定
CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
decimal itemPrice = 1980m;
// 静的クラスはインスタンス化 (new) せずに、クラス名から直接メソッドを呼び出す
// var calculator = new TaxCalculator(); // これはコンパイルエラーになる
decimal taxAmount = TaxCalculator.GetTaxAmount(itemPrice);
decimal totalPrice = TaxCalculator.GetPriceWithTax(itemPrice);
Console.WriteLine($"本体価格: {itemPrice:C}");
Console.WriteLine($"消費税額: {taxAmount:C} (税率 {TaxCalculator.CurrentTaxRate * 100}%)");
Console.WriteLine($"税込価格: {totalPrice:C}");
}
}
/// <summary>
/// 消費税計算を提供する静的クラス
/// </summary>
public static class TaxCalculator
{
// 1. 定数や静的フィールド
// 現在の税率 (10%)
public const decimal CurrentTaxRate = 0.10m;
// 2. 静的メソッド
// クラス内のメンバーはすべて 'static' でなければならない
/// <summary>
/// 税額を計算する(切り捨て)
/// </summary>
public static decimal GetTaxAmount(decimal price)
{
return Math.Floor(price * CurrentTaxRate);
}
/// <summary>
/// 税込価格を計算する
/// </summary>
public static decimal GetPriceWithTax(decimal price)
{
decimal tax = GetTaxAmount(price);
return price + tax;
}
}
出力結果:
本体価格: ¥1,980
消費税額: ¥198 (税率 10%)
税込価格: ¥2,178
静的クラスの利点と用途
静的クラスは、主に以下の用途に適しています。
- ユーティリティ(ヘルパー)クラス: 特定のオブジェクトの状態に依存しない、汎用的な処理(計算、ファイル操作、文字列変換など)をまとめる場合。
- 定数クラス: アプリケーション全体で共有する定数値を管理する場合。
- 拡張メソッドの定義: C#の拡張メソッドは、静的クラスの中に定義する必要があります。
静的コンストラクタ
静的クラスはインスタンス化されませんが、「静的コンストラクタ」を持つことはできます。 静的コンストラクタは、そのクラスのメンバーに初めてアクセスされたタイミングで、一度だけ自動的に実行されます。複雑な静的データの初期化が必要な場合に使用されます。
public static class AppConfig
{
public static DateTime StartupTime { get; }
// 静的コンストラクタ (アクセス修飾子は付けない)
static AppConfig()
{
StartupTime = DateTime.Now;
Console.WriteLine("設定を初期化しました。");
}
}
まとめ
静的クラス(static class)は、インスタンス生成を禁止し、機能だけを提供するための仕組みです。
- クラス定義に
staticを付けます。 - すべてのメンバー(メソッド、プロパティ)にも
staticが必須となります。 ClassName.MethodName()の形式で、どこからでも簡潔に呼び出すことができます。
オブジェクトの状態(データ)を保持する必要がなく、入力に対して決まった出力を返すだけの「関数群」を定義する場合、静的クラスとして実装するのが最適です。
