我希望能够用某种属性来装饰我的类,以强制使用using语句,以便始终安全地处理并避免内存泄漏。有人知道这样的技术吗?
我希望能够用某种属性来装饰我的类,以强制使用using语句,以便始终安全地处理并避免内存泄漏。有人知道这样的技术吗?
嗯,有一种方法可以做到这一点 - 只允许通过一个接受委托的静态方法访问您的对象。以下是一个非常简化的示例(显然,有许多不同的打开文件的方法 - 读取/写入等):
public static void WorkWithFile(string filename, Action<FileStream> action)
{
using (FileStream stream = File.OpenRead(filename))
{
action(stream);
}
}
如果只有你自己类中的方法能够创建一个可处理的对象实例,你可以确保它们被适当地使用。当然,委托可能会复制引用并尝试以后使用它,但那不是完全相同的问题。
当然,这种技术严重限制了你对该对象的操作 - 但在某些情况下它可能很有用。
如果您想确保对象始终被处理,请在IDisposable中使用finalizer。
但在此之前,请先了解IDisposable和finalizer,并意识到通常情况下,除非您的类正在执行类似于管理未托管资源的生命周期之类的操作,否则您通常不需要它们。
使用finalizer,无论是否包装在using语句中,都将最终回收您的对象。using语句是IDisposable的一种便利方式,允许进行确定性清理。唯一的注意事项是具有finalizer的对象更昂贵,而且通常在等待最终处理时会在内存中停留更长时间。
参考 何时需要实现finalizer或IDisposable? 或 技术难题:使用Dispose、Finalizers和IDisposable