6

真的希望能够用某种属性来装饰我的类,该属性将强制使用 using 语句,以便始终安全地处理该类并避免内存泄漏。有人知道这种技术吗?

4

3 回答 3

13

好吧,有一种方法可以做到这一点 - 只允许通过接受委托的静态方法访问您的对象。作为一个非常简化的示例(显然有许多不同的打开文件的方式 - 读/写等):

public static void WorkWithFile(string filename, Action<FileStream> action)
{
    using (FileStream stream = File.OpenRead(filename))
    {
        action(stream);
    }
}

如果唯一能够创建一次性对象实例的东西是您自己的类中的方法,那么您可以确保它们得到适当的使用。诚然,没有什么可以阻止委托复制参考并在以后尝试使用它,但这不是完全相同的问题。

当然,这种技术严重限制了您可以对对象执行的操作 - 但在某些情况下它可能很有用。

于 2009-04-15T10:13:25.873 回答
3

您可以使用FxCop来强制执行此规则。请参阅 Wikipedia 以获得快速概览

于 2009-04-15T10:12:13.753 回答
0

如果要确保始终释放对象,请将终结器与 IDisposable 结合使用。

但在您这样做之前,请阅读 IDisposable 和终结器,并意识到您通常不需要它们,除非您的类正在执行诸如管理非托管资源的生命周期之类的事情。

使用终结器,您的对象将“最终”被回收,无论是否包含在 using 中。using 语句对 IDisposable 很方便,它允许进行确定性清理。唯一需要注意的是,带有终结器的对象清理起来成本更高,并且在等待终结时通常会在内存中停留更长时间。

ref我什么时候需要实现终结器或 IDisposable?technorabble:使用 Dispose、Finalizers 和 IDisposable

于 2009-04-15T11:19:46.850 回答