2

C# で静的デストラクタが許可されていない理由を知りたいです。それらが他の言語に存在するとは想定していないことに注意してください。

このようなクラスを持つことができます。

 class A
 {
      static A()
      {
         // here I can load a resource that will be avaliable for all instances 
         // of this class.
      }
 }

アプリケーションが終了したら、リソースを解放する必要があるかもしれません。

したがって、静的デストラクタのセマンティックは次のようになります。アプリケーションの終了時に呼び出され、それを含み、アプリで初期化されたクラスに対して呼び出されます。

4

2 に答える 2

4

したがって、静的デストラクタのセマンティックは次のようになります。

セマンティックは、実行の最後に特定のアクションを実行するプログラムに依存しており、これを正しく処理することは、プロセスの通常の実行の最後に実行されるコードの一部よりもはるかに困難です。

トランザクションまたはファイル管理操作について考えてみてください。プロセスのクラッシュと予期しない終了を手動で処理し、とにかく次の実行時に回復を試みる必要があるため、静的デストラクタを使用してもあまり役に立ちません。.NET マネージの世界では、代わりにパターンを使用することが好まれます。これで深刻な問題が発生した場合は、イベント ハンドラーを のDomainUnloadedイベントにアタッチし、AppDomainそこでクリーンアップを実行してみてください。

また、シングルトンの破棄方法を試すこともできます。

class A : IDisposable
{
    public static A Instance {get; private set;}

    public static A()
    {
        Instance=new A();
    }

    public void MethodA() {...}

    public void Dispose()
    {
        //...
    }

    ~A()
    {
        // Release your hard resources here
    }
}

次に、安全な方法を使用します。

A.Instance.MethodA();
于 2012-10-03T13:23:23.450 に答える
4

あなたのセマンティックは考えられるものの1つですが、それが言語に与えるすべての影響をチェックしていないと思います. 私が知っているほとんどの (多かれ少なかれ) 動的言語では、破壊は見た目よりもはるかに複雑なトピックです。クラスが参照されなくなったときにデストラクタを呼び出さないのはなぜですか? または、アセンブリがアンロードされている場合は? デストラクタはどのような順序で呼び出す必要がありますか? ...?

アプリケーションの終了時にコードを実行したい場合は、.Net のドキュメントを参照してください。これを行うには、より簡単で信頼性の高い方法があります。

于 2012-10-03T13:17:44.453 に答える