如何使IDisposable对象成为一个类变量?

Ben*_*Ben 6 c# idisposable active-directory class-variables

我正在使用C#使用Active Directory.实例化PrincipalContext对象似乎很昂贵,所以我想将一个存储在一个类变量中.

PrincipalContext用作局部变量时,我可以使用方便的using语法.将IDisposable对象存储在静态变量中时,如何确保对象被正确处理?

Ada*_*son 7

一般模式是IDisposable在您的类上实现接口.举个例子:

public class YourClass : IDisposable
{
    private OtherDisposableType yourResource;

    public YourClass()
    {
        yourResource = new OtherDisposableType();
    }

    public void Dispose()
    {
        yourResource.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

这至少是您需要做的事情.

编辑

我之前的版本主张在所有情况下遵循终结器模式,这是(正确地)指出是违反框架设计指南.但是,如果您实际处理非托管资源(例如,您正在进行直接P/Invoke调用并获取需要明确释放的句柄),建议您创建一个终结器并Dispose在其中调用防止使用您的代码并且不打电话的人Dispose:

public class YourClass : IDisposable
{
    private OtherDisposableType yourResource;

    public YourClass()
    {
        yourResource = new OtherDisposableType();
    }

    public void Dispose()
    {
        yourResource.Dispose();

        GC.SuppressFinalize(this);
    }

    ~YourClass()
    {
        Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它开始很好.但在推荐实施终结器后,他走了下坡路.删除它,你会发布一个很好的答案. (3认同)
  • 实际上,Microsoft建议不要创建终结器,除非您正在处理非托管资源.即便如此,您通常可以通过使用SafeHandle等包装器来避免它.有关详细信息,请参阅"框架设计指南"一书中的"处理模式"一节.http://www.amazon.com/Framework-Design-Guidelines-Conventions-Libraries/dp/0321545613 (2认同)