tonari note

オンラインゲームエンジニアの雑記

静的コンストラクタ

静的クラスのお話 - tonari note

1年ぐらい前に静的クラスの記事書いてたらしいですが、その補足です。
静的コンストラクタの呼び出されるタイミングですが、

  • 最初のインスタンスを作成する前、または静的メンバーが参照される前

です。

using System;

public class Program
{
	public static void Main(string[] args)
	{
		var a1 = new A();
		var a2 = new A();
	}
}

public class A
{
	static A()
	{
		Console.WriteLine("静的コンストラクタ");
	}

	public A()
	{
		Console.WriteLine("コンストラクタ");
	}
}

実行結果

コンストラクタとかよりも前です。
インスタンス化しなくても、静的メソッド呼び出しとかしても呼ばれます。

using System;

public class Program
{
	static Program()
	{
		Console.WriteLine("静的コンストラクタ");
	}

	public static void Main(string[] args)
	{
		Console.WriteLine("Mainメソッド");
	}
}

実行結果

なのでMainメソッドの中身より前に呼ばれます。
ですが、以下の場合のようにメンバーを参照しようとしない場合は呼ばれません。

using System;

public class Program
{
	public static void Main(string[] args)
	{
		var type = typeof(A);
	}
}

public class A
{
	static A()
	{
		Console.WriteLine("静的コンストラクタ");
	}
}

実行結果