结合 foreach 和 using
我正在迭代 ManagementObjectCollection (这是WMI 接口的一部分)。
然而,重要的是下面这行代码。 :
foreach (ManagementObject result in results)
{
//code here
}
重点是 ManagementObject 也实现了 IDisposable,所以我想将“结果”变量放在 using 块中。知道如何做到这一点,而又不会变得太奇怪或复杂吗?
I'm iterating over a ManagementObjectCollection ( which is part of the WMI interface).
However, the important thing is, the following line of code. :
foreach (ManagementObject result in results)
{
//code here
}
The point is that ManagementObject also implements IDisposable, so I would like to put the "result" variable in a using block. Any idea on how to do this, without getting too weird or complex?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(6)
您可以执行以下操作。
foreach (ManagementObject result in results)
{
using (result)
{
// Your code goes here.
}
}
C# 的巧妙之处在于不同的语言结构可以共享作用域代码块。这意味着您可以执行以下操作来消除嵌套。
foreach (ManagementObject result in results) using (result)
{
// Your code goes here.
}
了解 foreach
构造也会在目标 IEnumerator
上调用 Dispose
也很有用。上面的代码相当于。
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();
}
}
您可以通过扩展方法和枚举器获得简洁的语法。首先,在代码中的某个 public static class
中定义它:
public static IEnumerable<ManagementObject> WithDisposal(
this ManagementObjectCollection list)
{
using (list)
{
foreach (var obj in list)
{
using (obj)
{
yield return obj;
}
}
}
}
...然后您可以将其与以下内容一起使用:
foreach (var obj in /*get the results*/.WithDisposal())
{
// ...
}
尽管请记住,如果您使用 WithDisposal
那么您将无法保存任何对象以供将来使用。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在
using
块之外分配变量通常不是好的做法,因为资源将被释放,但可能保留在范围内。但是,这会导致此处的代码更清晰,因为您可以针对foreach
嵌套using
语句。Assigning the variable outside the
using
block is not normally good practice because the resource would be disposed of but could stay in scope. It would, however, result in clearer code here because you can nest theusing
statement against theforeach
.