5

変数が.Net言語でスコープを失うとすぐにファイナライズ/デストラクタコードを「自動的に」実行する方法はありますか? ガベージ コレクターは不確定な時間に実行されるため、変数がスコープを失うとすぐにデストラクタ コードが実行されないように思えます。IDisposable から継承し、オブジェクトで Dispose を明示的に呼び出すことができることはわかっていますが、非 .Net C++ がオブジェクトの破棄を処理する方法と同様に、より手間のかからない解決策があることを望んでいました。

望ましい動作 (C#):

public class A {
    ~A { [some code I would like to run] }
}

public void SomeFreeFunction() {
    SomeFreeSubFunction();
    // At this point, I would like my destructor code to have already run.
}

public void SomeFreeSubFunction() {
    A myA = new A();
}

あまり望ましくない:

public class A : IDisposable {
    [ destructor code, Dispose method, etc. etc.]
}

public void SomeFreeFunction() {
    SomeFreeSubFunction();
}

public void SomeFreeSubFunction() {
    A myA = new A();
    try {
        ...
    }
    finally {
        myA.Dispose();
    }
}
4

3 に答える 3

9

using コンストラクトは、あなたが望むものに最も近いものです:

using (MyClass o = new MyClass()) 
{
 ...
}

Dispose() は、例外が発生した場合でも自動的に呼び出されます。ただし、クラスは IDisposable を実装する必要があります。

ただし、オブジェクトがメモリから削除されるわけではありません。あなたはそれを制御できません。

于 2009-09-14T18:04:06.613 に答える
4

IDisposable を実装するオブジェクトの using キーワードはまさにそれを行います。

例えば:

using(FileStream stream = new FileStream("string", FileMode.Open))
{
    // Some code
}

これは、コンパイラによって次のように置き換えられます。

FileStream stream = new FileStream("string", FileMode.Open);
try
{
    // Some code
}
finally
{
    stream.Dispose();
}
于 2009-09-14T18:03:57.677 に答える
3

残念だけど違う。

最適なオプションは、IDisposable パターンを使用してIDisposableを実装することです。

于 2009-09-14T18:04:10.530 に答える