当对象设置为null时,针对CLR的编译器是否可以生成Dispose方法调用?

Gir*_*ain 3 c# compiler-construction dispose

当编译器设置为null时,编译器(例如C#)会自动生成对对象的Dispose方法的调用(当然,对象应该首先支持Dispose方法).例如,如果我们写

cnSqlConnection = null;

和cnSqlConnection是一个SqlConnection类型的实例,在更新引用null之前,C#编译器可以注入Dispose方法调用吗?

此外,由于框架类确实支持多次调用Dispose方法的场景,因此如果调用重复,则没有任何害处.

Tim*_*son 7

(a)正确实现的对象应在其终结器中执行相同的清理逻辑.如果省略调用Dispose,终结器逻辑可能仍会运行.

(b)Raymond Chen在此解释了自动处置的复杂性.总结:让人类程序员Dispose在正确的位置打电话是非常安全的.如果你将自动处理结果用于逻辑结论,那么你最终会得到引用计数,这就是CLR内存模型要避免的.