在使用块

时间:2016-07-15 18:03:47

标签: c# active-directory dispose idisposable

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

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];行引发,表示目录条目已经处理完毕。我可以删除使用块,代码将工作,但我担心该对象永远不会被处置。我多次调用它,因此创建的目录条目的多个实例也从未被处理过?

1 个答案:

答案 0 :(得分:5)

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

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