静的コンストラクター
静的な状態を一度だけ初期化します。
「静的コンストラクター」は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フィードバックを取得できます。ローカル設定は不要です。