11

C#でWCFサービスを作成しています。当初、私の実装には1回限りの初期化を行う静的コンストラクターがありましたが、実行中の初期化の一部が(一時的に)失敗する可能性があります。

最初の(失敗した)試行で例外がスローされた場合でも、静的コンストラクターは1回だけ呼び出されるようです。その後、クラスをインスタンス化しようとするとTypeInitializationException、コードが実際に実行されずにすぐに失敗します。

C#言語仕様では、静的コンストラクターは最大で1回呼び出されると規定されていますが、基本的にこれは例外となり、たとえキャッチしても回復できないエラーが発生しますか?

ここで何かが足りませんか?リモートで危険なものをサービスのインスタンスコンストラクターに移動し、クラスの初期化が以前に正常に完了したかどうかを手動で確認する必要があると思いますか?

4

3 に答える 3

4

したがって、重要な部分をtry / catchでラップすることができます。少なくとも、型の初期化に失敗しないことを意味しますが、初期化コードが重要である場合、この動作は実際には良好です。この型は、この初期化されていないものでは使用できません。州。

もう1つのオプションは、シングルトンとして実行することです。インスタンスを取得しようとするたびに、最初に失敗した場合でも、成功するまでタイプを正しく作成できます。

インスタンスが最初(または2回目など)にnullを返した場合に備えて、呼び出し元でエラー処理を行う必要があります。

編集:シングルトンが必要ない場合は、インスタンスコンストラクターに静的部分を初期化させるだけです

例えば

private object _lock = new object()
private bool _initialized;

public T()
{
   lock(_lock)
   {
      if(!_initialized)
      {
         try
         {
           //Do static stuff here
         }
         catch(Exception ex_)
         {
           //Handle exception
         }
      } 
   }
}
于 2009-08-25T14:07:14.857 に答える
4

ここでのレッスンは非常に単純です。静的コンストラクターでは、合理的に失敗する可能性のあることは何もしないでください。

于 2009-08-25T14:05:31.133 に答える
1

過去に使用した回避策は、シングルトンを作成することです。失敗がアプリケーション全体を実行できないことを意味する場合にのみ、静的コンストラクターを失敗させます。

于 2009-08-25T14:08:18.663 に答える