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 之前处理的相同实例。
我在 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 之前处理的相同实例。