【发布时间】:2023-04-08 18:48:02
【问题描述】:
假设我定义了一个类MyDisposable : IDisposable。我知道我可以为using 语句提供一个硬编码的IDisposable 对象列表:
using (MyDisposable firstDisposable = new MyDisposable(),
secondDisposable = new MyDisposable())
{
// do something
}
现在假设我有一些方法可以对一次性对象的集合执行操作,我想在 using 语句中执行此操作。它可能看起来像这样(但这当然不起作用,因为 using 块需要一个或多个 IDisposable 对象,而我正在传递一个集合对象):
using (var myDisposables = GetMyDisposables())
{
foreach (var myDisposable in myDisposables)
{
DoSomething(myDisposable);
DoSomethingElse(myDisposable);
}
}
为了清楚起见,以下是其他方法:
static List<MyDisposable> GetMyDisposables()
{
throw new NotImplementedException(); // return a list of MyDisposable objects
}
static void DoSomething(MyDisposable withMyDisposable)
{
// something
}
static void DoSomethingElse(MyDisposable withMyDisposable)
{
// something else
}
有没有什么方法可以用using 语句完成这个任务?还是我只需要丢弃该语句并手动处理?
【问题讨论】:
-
你可以创建一个
DisposableCollection<T> : IDisposable, IEnumerable<T> where T : IDisposable -
您可以编写
IDisposable,它封装了您的MyDisposable对象的集合,并在您处置它时处置其所有元素。 -
为什么不在 foreach 块中添加 using 语句?
-
@peinearydevelopment -- 因为那样我就不能使用 next foreach 中的对象...它们已经在第一个中被处理了。
-
@peinearydevelopment 因为这样处理项目的错误会泄漏集合中所有尚未处理的项目。
标签: c# .net idisposable using-statement