Объединение foreach и использование

Я выполняю итерации по ManageObjectCollection. (который является частью интерфейса WMI).

Однако важная вещь, следующая строка кода.:

foreach (ManagementObject result in results)
{
    //code here
}

Дело в том, что ManageObject также реализует IDisposable, таким образом, я хотел бы поместить переменную "результата" в блок использования. Какая-либо идея о том, как сделать это, не становясь слишком странным или сложным?

30
задан David Neale 9 June 2010 в 11:32
поделиться

4 ответа

foreach (ManagementObject result in results)
using(result)
{
    //code here
}

Обычно не рекомендуется назначать переменную вне с помощью , поскольку ресурс будет удален, но останется в области видимости. Однако это привело бы к более ясному коду, потому что вы можете вложить using оператор в foreach .

РЕДАКТИРОВАТЬ: Как указано в другом ответе, ManagementObjectCollection также реализует IDisposable , поэтому я добавил это в , используя блок .

Нет необходимости помещать ManagementObjectCollection в оператор using. foreach вызовет Dispose () в перечислителе.

26
ответ дан 27 November 2019 в 23:56
поделиться

Вы можете сделать следующее.

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();
  }
}
19
ответ дан 27 November 2019 в 23:56
поделиться

ManagementObjectCollection сам по себе IDisposable ...

Таким образом, это будет ...

using (var results = ..)
{
    foreach (var result in results)
    {
        using (result)
        {
            ...
        }
    }
}
2
ответ дан 27 November 2019 в 23:56
поделиться

Это будет выглядеть странно - итерация по массиву и утилизация каждого из содержащихся в нем объектов. Если вы действительно хотите сделать это, используйте

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.

-1
ответ дан 27 November 2019 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: