如果我使用ManagementObjectSearcher
,我可以轻松地将其包装在using
块中:
using (var searcher = new ManagementObjectSearcher(scope, query))
{
// ...
}
由于the collection returned from the searcher:
这一事实,处置foreach
automatically calls dispose on the enumerator也很容易
using (var searcher = new ManagementObjectSearcher(scope, query))
{
foreach(ManagementObject mo in searcher.Get())
{
// ...
}
}
但ManagementObject
也实现了IDisposable
:
using (var searcher = new ManagementObjectSearcher(scope, query))
{
foreach(ManagementObject mo in searcher.Get())
{
// ...
mo.Dispose(); // ?
}
}
ManagementObject
实例?Dispose
)?特别是像searcher.Get().First()
?修改:更多相关问题:
Dispose
?他们都实现了自己的IDisposable
方法,但似乎搜索者只从Dispose
继承了Component
实现;它没有添加自己的处置行为。
答案 0 :(得分:3)
ManagementObject
个对象继承的所有内容, System.ComponentModel.Component
继承自Component
和you should call Dispose
explicitly。
您可以将LINQ
方法与您自己的谓词一起使用,该谓词本身会调用Dispose
:
var first = searcher.Get().First(x =>
{
bool result = Satisfy(x);
if (!result)
{
x.Dispose();
}
return result;
});
此代码相当于:
ManagementObject first = null;
foreach (var element in searcher.Get())
{
if (Satisfy(element))
{
first = element;
break;
}
else
{
element.Dispose();
}
}
if (first == null)
{
throw new InvalidOperationException("No match");
}
Satisfy
是您自己的方法。