staticとは?
一言でいうと、
「クラス全体で共有されるメンバー」を作るキーワードです。
ふつう、クラスを使うときは new でインスタンスを作りますが、
static をつけると、「インスタンスを作らずに使える」ようになります。
例
class Counter
{
public static int Total = 0; // クラス全体で共有
public int Id;
public Counter()
{
Total++; // 全員で1つのTotalを共有
Id = Total;
}
}
使うとこうなります
var a = new Counter(); // Total = 1
var b = new Counter(); // Total = 2
Console.WriteLine(Counter.Total); // 2
ここがポイント:
- Total は 全インスタンスで共通
- Id は それぞれのインスタンスごと
staticメソッドとは?
クラスを作らなくても呼び出せる便利なメソッドです。
たとえば、計算用のメソッドをまとめたいときに便利です。
public static class MathUtil
{
public static int Square(int x)
{
return x * x;
}
}
// 呼び出し
int result = MathUtil.Square(5); // 25
「MathUtil」はインスタンスを作らず、そのまま呼べます。
static クラスは「全てのメンバーがstaticであること」がルールです。
staticコンストラクタ
static なデータを最初に一度だけ初期化したいときに使います。
class Config
{
public static readonly string AppName;
static Config() // 一度だけ実行される
{
AppName = "MyApp";
Console.WriteLine("Config 初期化!");
}
}
Config.AppName にアクセスした瞬間、
最初の一回だけコンストラクタが呼ばれます。
const と static readonly の違い
種類 | タイミング | 値の変更 | よく使う場面 |
---|---|---|---|
const | コンパイル時 | 変更不可 | 定数 |
static readonly | 実行時 | 1回だけ代入OK | 設定値など |
public const double PI = 3.14;
public static readonly DateTime StartTime = DateTime.Now;
static の注意点
グローバル変数みたいに使いすぎない
どこからでも触れる=便利ですが、
裏を返すと「どこで変更されたか分からなくなる」リスクもあります。
メモリに残り続ける
static はアプリが終わるまで消えません。
大量データを static に持たせるのはNGです。
staticが向いている場面
- 計算系の関数
- 変更しない設定値・定数
- 一度だけ使う共通データ(ログ設定など)
まとめ
内容 | 説明 |
---|---|
static | クラス全体で共有されるメンバーを作る |
メリット | インスタンス不要・共通データ管理が簡単 |
デメリット | グローバル状態・テストが難しくなる |
よく使う場面 | 定数、ユーティリティ、設定 |
static は使い方次第で便利にも危険にもなります。
- 定数やヘルパー関数には◎
- 態を持たせすぎるのは×
迷ったら「これは全員で共有すべきデータか?」と考えるのがコツ!