0Pricing
C# Academy · レッスン

静的コンストラクター

静的な状態を一度だけ初期化します。

「静的コンストラクター」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

静的コンストラクターとは

静的コンストラクターは、クラスの静的データを初期化します。クラスが初めて使用される前に一度だけ自動的に実行され、直接呼び出すことはありません。

using System;

class App
{
    public static string Version;

    static App()
    {
        Version = "1.0.0";
        Console.WriteLine("Static constructor ran");
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(App.Version);
    }
}

構文のルール

静的コンストラクターは static キーワードを使い、クラス名と同じ名前を持ち、パラメーターを受け取らず、アクセス修飾子も持ちません。

using System;

class Config
{
    public static int MaxUsers;

    static Config()
    {
        MaxUsers = 100;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Max: " + Config.MaxUsers);
    }
}

正確に一度だけ実行される

クラスを何度使用しても、静的コンストラクターが実行されるのは、初めて必要になったときの一度だけです。

using System;

class Counter
{
    public static int Instances;

    static Counter()
    {
        Console.WriteLine("Initializing static state");
        Instances = 0;
    }

    public Counter() { Instances++; }
}

class Program
{
    static void Main()
    {
        new Counter();
        new Counter();
        Console.WriteLine("Instances: " + Counter.Instances);
    }
}

いつ実行されるのか

ランタイムは、静的メンバーへの最初のアクセス、または最初のインスタンス生成の直前に静的コンストラクターを呼び出します。先に発生したほうが契機になります。

using System;

class Lazy
{
    public static string Data;

    static Lazy()
    {
        Console.WriteLine("Triggered now");
        Data = "ready";
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Before access");
        Console.WriteLine(Lazy.Data);
    }
}

複雑な静的データの初期化

静的フィールドのセットアップに単純なリテラル以上の処理が必要な場合は、静的コンストラクターを使用します。

using System;
using System.Collections.Generic;

class Lookup
{
    public static Dictionary<int, string> Table;

    static Lookup()
    {
        Table = new Dictionary<int, string>();
        for (int i = 1; i <= 3; i++)
            Table[i] = "Item" + i;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Lookup.Table[2]);
    }
}

静的コンストラクターとフィールド初期化子

単純な値にはインライン初期化子を使用できます。ステートメント、ループ、エラー処理が必要なセットアップには、静的コンストラクターを使用します。

using System;

class Settings
{
    public static int Simple = 10;        // inline initializer
    public static int Computed;            // needs logic

    static Settings()
    {
        Computed = Simple * Simple;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Settings.Simple + ", " + Settings.Computed);
    }
}

パラメーターは使用できません

静的コンストラクターはランタイムが自動的に呼び出すため、引数を受け取れません。入力として使えるのは、ほかの静的データまたは定数だけです。

using System;

class Clock
{
    public static int StartHour;

    static Clock()
    {
        StartHour = 9;
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Start: " + Clock.StartHour);
    }
}

静的コンストラクターとインスタンスコンストラクターの組み合わせ

1つのクラスに両方を定義できます。静的コンストラクターは型に対して一度実行され、インスタンスコンストラクターはオブジェクトごとに実行されます。

using System;

class Game
{
    public static string Title;
    public int Score;

    static Game()
    {
        Title = "Coddy Quest";
    }

    public Game(int score)
    {
        Score = score;
    }
}

class Program
{
    static void Main()
    {
        var g = new Game(50);
        Console.WriteLine(Game.Title + " score " + g.Score);
    }
}

実行順序の保証

静的コンストラクターを実行するインスタンスコンストラクターの本体が実行される前に、静的コンストラクターが必ず完了します。そのため、静的な状態は常に準備されています。

using System;

class Service
{
    public static string Endpoint;

    static Service()
    {
        Endpoint = "https://api.example.com";
    }

    public Service()
    {
        Console.WriteLine("Using " + Endpoint);
    }
}

class Program
{
    static void Main()
    {
        new Service();
    }
}

必要な場合だけ使う

静的コンストラクターは、クラスを使用する前に一度だけチェックを追加します。使いすぎたり例外をスローしたりすると、パフォーマンスに悪影響を及ぼす可能性があります。処理は小さく、信頼性の高いものに保ちましょう。

using System;

class Cache
{
    public static int[] Data;

    static Cache()
    {
        Data = new int[] { 2, 4, 6, 8 };
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Cache.Data[3]);
    }
}

まとめてみましょう

静的コンストラクターは、検索テーブルや定数から読み込む構成など、共有される読み取り専用データを一度だけセットアップする場合に適しています。

using System;
using System.Collections.Generic;

class Currency
{
    public static Dictionary<string, string> Symbols;

    static Currency()
    {
        Symbols = new Dictionary<string, string>
        {
            ["USD"] = "$",
            ["EUR"] = "E",
            ["JPY"] = "Y"
        };
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("USD symbol: " + Currency.Symbols["USD"]);
    }
}

理解度チェック

静的コンストラクターについての理解度を確認しましょう。

まとめ

静的コンストラクターは、パラメーターもアクセス修飾子も持たない static ClassName() という形式を使用します。クラスが初めて使用される前に一度だけ自動的に実行され、複雑な処理が必要な静的状態を初期化します。共有データの一度だけのセットアップに、必要な場合だけ使用しましょう。

using System;

class Demo
{
    public static int Value;
    static Demo() { Value = 42; }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Demo.Value);
    }
}

よくある質問

「静的コンストラクター」レッスンは無料ですか?

はい。「静的コンストラクター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「静的コンストラクター」で何を学びますか?

静的な状態を一度だけ初期化します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「静的コンストラクター」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コンストラクターの定義
  2. thisによるコンストラクターの連鎖
  3. オブジェクトとコレクションの初期化子
  4. 静的コンストラクター
← C# Academyに戻る