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
时看到相同主体的错误。