Я выполняю итерации по ManageObjectCollection. (который является частью интерфейса WMI).
Однако важная вещь, следующая строка кода.:
foreach (ManagementObject result in results)
{
//code here
}
Дело в том, что ManageObject также реализует IDisposable, таким образом, я хотел бы поместить переменную "результата" в блок использования. Какая-либо идея о том, как сделать это, не становясь слишком странным или сложным?
foreach (ManagementObject result in results)
using(result)
{
//code here
}
Обычно не рекомендуется назначать переменную вне с помощью
, поскольку ресурс будет удален, но останется в области видимости. Однако это привело бы к более ясному коду, потому что вы можете вложить using
оператор в foreach
.
РЕДАКТИРОВАТЬ:
Как указано в другом ответе, ManagementObjectCollection
также реализует IDisposable
, поэтому я добавил это в , используя блок
.
Нет необходимости помещать ManagementObjectCollection
в оператор using. foreach
вызовет Dispose ()
в перечислителе.
Вы можете сделать следующее.
foreach (ManagementObject result in results)
{
using (result)
{
// Your code goes here.
}
}
Самое замечательное в C# - это то, что различные языковые конструкции могут использовать общие блоки кода. Это означает, что для устранения вложенности можно сделать следующее.
foreach (ManagementObject result in results) using (result)
{
// Your code goes here.
}
Также полезно знать, что конструкция foreach
вызовет Dispose
на целевом IEnumerator
. Приведенный выше код будет эквивалентен.
IEnumerator enumerator = results.GetEnumerator()
try
{
while (enumerator.MoveNext())
{
ManagementObject result = (ManagementObject)enumerator.Current;
IDisposable disposable = (IDisposable)result;
try
{
// Your code goes here.
}
finally
{
disposable.Dispose();
}
}
}
finally
{
IDisposable disposable = enumerator as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
ManagementObjectCollection
сам по себе IDisposable
...
Таким образом, это будет ...
using (var results = ..)
{
foreach (var result in results)
{
using (result)
{
...
}
}
}
Это будет выглядеть странно - итерация по массиву и утилизация каждого из содержащихся в нем объектов. Если вы действительно хотите сделать это, используйте
foreach (ManagementObject result in results)
{
try {
// code here
}
finally {
result.Dispose();
}
}
/* do not forget to, or to not reuse results!
results = null;
results.Clear();
*/
что как раз и делает оператор using
.