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 语句中声明它们

所以我希望这两组 using 块是等效的。但是,虽然 ManagementObjectCollection实现了 IDisposable ManagementObject并没有实现,但使用文档也告诉我们:

提供给 using 语句的对象必须实现 IDisposable 接口。该接口提供了 Dispose 方法,该方法应该释放对象的资源。

因此,由于 using 块无论如何都无法处理 ManagementObject 资源,因此您不需要 ManagementObject 在其自己的 using 块中,可以使用

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

老实说,因为items并且item范围在 using 块内,您可能只需要

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

这应该为 GarbageCollection 释放它们,因此虽然您不知道items在 using 块的末尾调用了它的 Dispose 方法,但它将在下一个集合中调用。

于 2012-09-28T20:34:00.647 回答