7

重複の可能性:
C#でチルダ(〜)はどういう意味ですか?

class ResourceWrapper
{
    int handle = 0;
    public ResourceWrapper()
    {
        handle = GetWindowsResource();
    }
    ~ResourceWrapper()                     //this line here
    {
        FreeWindowsResource(handle);
        handle = 0;
    }
    [DllImport("dll.dll")]
    static extern int GetWindowsResource();
    [DllImport("dll.dll")]
    static extern void FreeWindowsResource(int handle);
}

示されている線上でチルダは何をしますか。

私はそれがビット単位のNOT演算子だと思っていました。実際、そこにあるブロック全体(コメント行とその後の括弧blovk)は本当に理解していません。それは、methdでも、パラメーターでも、何かでもありません。それは何ですか。そして、なぜその前にチルダがあるのですか?

4

6 に答える 6

10

それがデストラクタです。ガベージコレクション時にすべてのリソースが解放されるように注意してください。

于 2009-08-26T00:13:30.983 に答える
3

これにより、クラスのファイナライザー(Finalizeメソッド)が実装されます。通常、ファイナライザーを実装しないでください。

たとえば、外部の管理されていないリソースを保持するクラスに対してこれを行いますが、この場合もIDisposableパターンを実装するようにしてください。

于 2009-08-26T00:13:34.730 に答える
3

C ++と同様に、~ClassNameはデストラクタメソッドです。問題のオブジェクトがガベージコレクターによってクリーンアップされると、C#で呼び出されます。デストラクタが呼び出される決定論的な時間が存在するC++とは異なり、C#でデストラクタがいつ呼び出されるか(または呼び出される場合でも)を予測する方法はありません。

おそらくあなたが探しているのはIDisposableパターンであり、これはこれに対してはるかに優れたアプローチを提供します。

于 2009-08-26T00:16:28.333 に答える
1

それはデストラクタです。これにより、リソースの解放を暗黙的に制御できます。つまり、ガベージコレクタによって呼び出されます。リソースのリリースを明示的に制御する場合は、 IDisposableを実装できます。 チェックアウトファイナライズと廃棄を実装して、管理されていないリソースをクリーンアップしますフレームワーク設計ガイドラインにも詳細があります。

于 2009-08-26T00:20:10.333 に答える
0

了解しました。答えが見つかりましたが、質問を削除する方法がわかりません。クラスのデストラクタを指定します

于 2009-08-26T00:14:52.217 に答える
0

私はC#についての手がかりはありませんが、コードの機能からすると、これはデコンストラクターのように見えます。

  1. によって参照されるリソースを解放しますhandle
  2. 確実に設定handleする0

「ない」という概念と一緒に行くと思います...:)

私は間違っているかもしれませんが...

グリーツ

back2dos

于 2009-08-26T00:14:52.513 に答える