9

たとえば、次のように定義された独自の C# クラスがあるとします。

public class MyClass
{
    public MyClass()
    {
        //Do the work
    }
    ~MyClass()
    {
        //Destructor
    }
}

次に、ASP.NET プロジェクトからクラスのインスタンスを作成します。

if(true)
{
    MyClass c = new MyClass();
    //Do some work with 'c'

    //Shouldn't destructor for 'c' be called here?
}

//Continue on

ifスコープの最後でデストラクタが呼び出されることを期待していますが、呼び出されることはありません。私は何が欠けていますか?

4

3 に答える 3

8

C++ デストラクタに相当するのはIDisposable、ブロックDispose()でよく使用されるメソッドです。using

http://msdn.microsoft.com/en-us/library/system.idisposable.aspxを参照してください。

あなたがデストラクタと呼んでいるものは、Finalizer.

IDisposable の使用方法は次のとおりです。Dispose()は自動的に呼び出されないことに注意してください。あなたができる最善のことは、ブロックが最後に到達する前にブロック内に例外があったとしても、呼び出される原因となるwhichusing使用することです。Dispose()using

public class MyClass: IDisposable
{
    public MyClass()
    {
        //Do the work
    }

    public void Dispose()
    {
        // Clean stuff up.
    }
}

次に、次のように使用できます。

using (MyClass c = new MyClass())
{
    // Do some work with 'C'
    // Even if there is an exception, c.Dispose() will be called before
    // the 'using' block is exited.
}

.Dispose()必要に応じて、自分自身を明示的に呼び出すことができます。唯一のポイントは、何らかの理由で実行がブロックを離れたときにusing呼び出しを自動化することです。.Dispose()using

詳細については、こちらを参照してください: http://msdn.microsoft.com/en-us/library/yh598w02%28v=vs.110%29.aspx

基本的に、using上記のブロックは次と同等です。

MyClass c = new MyClass();

try
{
    // Do some work with 'C'
}

finally
{
    if (c != null)
        ((IDisposable)c).Dispose();
}
于 2013-06-24T08:03:25.083 に答える