使用linq和WMI集合

时间:2012-09-28 20:08:08

标签: c# linq garbage-collection wmi

我对发布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()

1 个答案:

答案 0 :(得分:2)

如果查看using

的文档
  

多个对象可以与using语句一起使用,但它们必须使用   在使用声明

中声明

所以我希望这两组使用块是等价的。但是,虽然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 (ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Service"))
    {
        ManagementObjectCollection items = s.Get()
        ManagementObject item = items.Cast<ManagementObject>().Last();
        //do stuff
    }

那应该为GarbageCollection释放它们,所以当你不知道items在使用块的末尾调用它的Dispose方法时,它将在下一个集合中被调用。