我对发布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()
答案 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
}
}
说实话,因为items
和item
在使用区域范围内,您可能只需要
using (ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Service"))
{
ManagementObjectCollection items = s.Get()
ManagementObject item = items.Cast<ManagementObject>().Last();
//do stuff
}
那应该为GarbageCollection释放它们,所以当你不知道items
在使用块的末尾调用它的Dispose方法时,它将在下一个集合中被调用。