1

IDisposable オブジェクトの解放について疑問があります。

using (ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Service"))
{
    using (ManagementObject item = s.Get().Cast<ManagementObject>().Last())
    {

    }
}

s.Get() からのコレクションも使用する必要がありますか?

using (ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Service"))
{
    using (ManagementObjectCollection items = s.Get())
    {
        using (ManagementObject item = items.Cast<ManagementObject>().Last())
        {

        }
    }
}

linq は、このトピックの最初のコード ブロックからコレクション (s.Get()) を破棄しますか?

s.Get().Cast<ManagementObject>().Last()
4

1 に答える 1

1

使用に関するドキュメントを見ると

複数のオブジェクトを using ステートメントで使用できますが、それらは using ステートメント内で宣言する必要があります

したがって、これらの 2 つの使用ブロックのセットは同等であると予想されます。ただし、 ManagementObjectCollectionは IDisposable ManagementObjectを実装していますが、実装していません。

using ステートメントに提供されるオブジェクトは、IDisposable インターフェイスを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放する Dispose メソッドを提供します。

とにかく、using ブロックは ManagementObject リソースを破棄できないため、独自の using ブロックに ManagementObject は必要なく、次を使用できます。

using (ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Service"))
{
    using (ManagementObjectCollection items = s.Get())
    {
        ManagementObject item = items.Cast<ManagementObject>().Last();
        //do stuff
    }
}

正直に言うと、itemsitemは using ブロック内にスコープされているため、おそらく必要なだけです

using (ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Service"))
    {
        ManagementObjectCollection items = s.Get()
        ManagementObject item = items.Cast<ManagementObject>().Last();
        //do stuff
    }

itemsそれは GarbageCollection のためにそれらを解放するはずなので、using ブロックの最後で Dispose メソッドが呼び出されているかどうかはわかりませんが、次のコレクションで呼び出されます。

于 2012-09-28T20:34:00.647 に答える