私はこれに対する答えをSOで探し回ったが、今のところ私が見つけた最良の答えはここただし、これは静的コンストラクターを持つインスタンス向けであり、クラスを静的にのみ使用しています。
私のコード:
public static class MailHelper {
private static string mailHost;
static MailHelper() {
var mailSettings = ConfigurationManager.GetSection("MailSettings") as NameValueCollection;
if (null == mailSettings) {
throw new ConfigurationErrorsException("Missing Mail Settings in the configuration file");
}
mailHost = ConfigurationManager.AppSettings["mailHost"];
if (null == mailHost) {
throw new ConfigurationErrorsException("Missing mailHost setting in the configuration file");
}
}
public static void SendMail(MailMessage Message) {
...
}
}
try {
MailHelper.SendMail(Message);
}
catch (ConfigurationErrorsException exc) {
...
}
// ???
MailHelper.SendMail(Message);
.
では、静的コンストラクターが最初に呼び出されたときに例外をスローした場合、静的 SendMail() メソッドに 2 回目にアクセスしようとすると何が起こるでしょうか?
PS: Stroustrup の K&R ブレース スタイルが気に入らない場合は申し訳ありませんが、ブレースを好みの Allman スタイルに変更するためだけに私の投稿を編集しないでください。ありがとうございます。
ベストアンサー1
型初期化子が一度失敗すると、再試行されることはありません。型は、AppDomain の有効期間中は無効です。(これは、静的コンストラクターを持つ型だけでなく、すべての型初期化子に当てはまることに注意してください。初期化子式を持つ静的変数を持つが、静的コンストラクターを持たない型では、型初期化子の実行のタイミングに微妙な違いが生じる可能性がありますが、それでも 1 回しか発生しません。)
デモンストレーション:
using System;
public sealed class Bang
{
static Bang()
{
Console.WriteLine("In static constructor");
throw new Exception("Bang!");
}
public static void Foo() {}
}
class Test
{
static void Main()
{
for (int i = 0; i < 5; i++)
{
try
{
Bang.Foo();
}
catch (Exception e)
{
Console.WriteLine(e.GetType().Name);
}
}
}
}
出力:
In static constructor
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException
ご覧のとおり、静的コンストラクターは 1 回だけ呼び出されます。