IDisposable 对象在使用块结束前处理

IDisposable object disposed before end of using block

我在 IDisposable DirectoryEntry 周围有一个 using 块来创建目录条目,访问它的一个属性,然后处理它。但是,目录条目在 using 块结束之前被释放。

public static PropertyValueCollection GetProperty(
    this Principal principal, string propertyName)
{
    using (var directoryEntry = principal.GetAsDirectoryEntry())
    {
        return directoryEntry.Properties[propertyName];
    }
}

public static DirectoryEntry GetAsDirectoryEntry(
    this Principal principal)
{
    return principal.GetUnderlyingObject() as DirectoryEntry;
}

return directoryEntry.Properties[propertyName];行抛出错误,说目录条目已经被处理掉了。我可以删除 using 块并且代码将工作,但我担心该对象永远不会被处置。我多次调用它,所以目录条目的多个实例是否正在创建并且从未被处理过?

您的代码没有创建 DirectoryEntry 实例,也没有创建 Principal.GetUnderlyingObject() 方法(这不是工厂方法)。由于您的代码不管理实例的生命周期,因此您的代码不应该处理它。

在这种特殊情况下,由 Principal.GetUnderlyingObject() 编辑的实例 return 实际上存储在 Principal 实例的状态中。处理一次后,对同一个 Principal 实例的 Principal.GetUnderlyingObject() 的每次后续调用都将 return 之前处理的相同实例。