C# 在使用块结束之前处置的IDisposable对象

C# 在使用块结束之前处置的IDisposable对象,c#,active-directory,dispose,idisposable,C#,Active Directory,Dispose,Idisposable,我在IDisposable DirectoryEntry周围有一个using块来创建目录条目,访问它的一个属性,然后处理它。但是,目录项在using块结束之前被释放 public static PropertyValueCollection GetProperty( this Principal principal, string propertyName) { using (var directoryEntry = principal.GetAsDirectoryEntry()

我在
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;
}

在返回directoryEntry.Properties[propertyName]时抛出错误行,表示目录项已被释放。我可以删除using块,代码也可以工作,但我担心对象永远不会被处理掉。我多次调用它,那么目录项的多个实例是否正在创建且从未处理?

您的代码没有创建
DirectoryEntry
实例,也没有创建
Principal.getUnderlineObject()
方法(它不是工厂方法)。因为您的代码不管理实例的生存期,所以您的代码不应该处理它


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

您的代码没有创建
目录条目
实例,也没有创建
主体.getUnderlineyObject()
方法(这不是工厂方法)。因为您的代码不管理实例的生存期,所以您的代码不应该处理它


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

您确定这是这一行吗?或者当它使用
属性值集合
时可能是消费者吗?@YacoubMassad-确实(至少从目前显示的代码来看)-OP明确地说“我多次调用它”-所以我认为他们知道他们处理
.getUnderlineObject()的结果
多次…complete将有助于在第二次调用
GetProperty
时看到相同
principal
的错误。您确定是这一行吗?还是在使用
PropertyValueCollection
时可能是消费者?@YacoubMassad-确实(至少从目前显示的代码来看)-OP明确地说“我多次调用它”-所以我想他们知道他们多次处理了
.getUnderlineObject()
的结果…complete将有助于在第二次调用
GetProperty
时看到相同
主体的错误。