如何自动处理列表中的对象?
How to automatically dispose objects inside List?
我有一个 class 需要处理的资源:
class Desert: IDisposable
{
private object resource; // handle to a resource
public Desert(string n)
{
// Create resource here
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (resource != null) resource.Dispose();
}
}
}
我想知道是否有任何方法可以自动要求框架在每个元素上调用 Dispose,只要 List 对象将被销毁,就像我有析构函数一样。目前我正在遍历列表并调用 Dispose:
// On form open
List<Desert> desertList = new List<Desert>();
for(int i = 0; i < 10; i++)
{
desertList.Add(new Desert("Desert" + i));
}
// On form closing
for (int i = 0; i < 10; i++)
{
desertList[i].Dispose();
}
这是在 List 中处理对象的唯一方法吗?
您可以扩展列表类型本身:
public class AutoDisposeList<T> : List<T>, IDisposable where T : IDisposable
{
public void Dispose()
{
foreach (var obj in this)
{
obj.Dispose();
}
}
}
using (var myList = new AutoDisposeList<Desert>())
{
}
如果您需要的不止于此,您可以查看 Finalizers。这些不完全是析构函数 - 它们是 运行 就在对象被垃圾收集之前的方法。虽然这些很容易出错,但我投票赞成 using 语句。
参见:https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.100).aspx
我有一个 class 需要处理的资源:
class Desert: IDisposable
{
private object resource; // handle to a resource
public Desert(string n)
{
// Create resource here
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (resource != null) resource.Dispose();
}
}
}
我想知道是否有任何方法可以自动要求框架在每个元素上调用 Dispose,只要 List 对象将被销毁,就像我有析构函数一样。目前我正在遍历列表并调用 Dispose:
// On form open
List<Desert> desertList = new List<Desert>();
for(int i = 0; i < 10; i++)
{
desertList.Add(new Desert("Desert" + i));
}
// On form closing
for (int i = 0; i < 10; i++)
{
desertList[i].Dispose();
}
这是在 List 中处理对象的唯一方法吗?
您可以扩展列表类型本身:
public class AutoDisposeList<T> : List<T>, IDisposable where T : IDisposable
{
public void Dispose()
{
foreach (var obj in this)
{
obj.Dispose();
}
}
}
using (var myList = new AutoDisposeList<Desert>())
{
}
如果您需要的不止于此,您可以查看 Finalizers。这些不完全是析构函数 - 它们是 运行 就在对象被垃圾收集之前的方法。虽然这些很容易出错,但我投票赞成 using 语句。
参见:https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.100).aspx