【发布时间】:2013-12-06 09:57:45
【问题描述】:
我有一个奇怪的问题,即使有围绕同一问题的线程,我也找不到明确的答案。
问题:如果我将一个对象设置为 null,这会导致 dispose 方法(已实现)被确定性地调用吗?例如在下面的代码中,通过将pricingEnvironment 对象设置为null,Dispose 会被立即调用吗?我知道如果不调用 Dispose,终结器将在某个时候为定价环境对象启动。
代码:
public interface IPricingService
{
double GetPrice(string instrument);
}
public interface IPricingEnvironment:IDisposable
{
void Initialize();
}
public class PricingEnvironment : IPricingEnvironment
{
public void Dispose()
{
DisposeObject();
}
public void Initialize()
{
//initialize something leaky
}
private void DisposeObject()
{
//release some leaky unmanaged resource
}
~PricingEnvironment()
{
DisposeObject();
}
}
public class PricingService:IPricingService, IDisposable
{
private IPricingEnvironment pricingEnvironment;
public PricingService()
{
pricingEnvironment = new PricingEnvironment();
}
public double GetPrice(string instrument)
{
pricingEnvironment.Initialize();
return 1d;
}
public void Dispose()
{
//Will this dispose the leaky resource used by pricing environment deterministically?
pricingEnvironment = null;
}
}
谢谢, -迈克
【问题讨论】:
-
作为旁注,我想说,如果你正在处理相对较小的对象,你可以让垃圾收集器独自完成他的工作。我不知道这是否是一个好习惯,但我几乎只在文件或数据库连接上使用
dispose()... -
不是您的问题的真正副本,而是设置 Null 与 Dispose 的一个非常好的答案 - stackoverflow.com/questions/574019/…
-
@Bartdude:良好的实践表明,每当一个类实现 IDisposable 时,您都应该调用 Dispose 方法
-
@LuisFilipe > 感谢您的见解 :-) 从现在开始,我将把它作为我的编码规则!
标签: c#