实现该
接口的类标明它们需要显式的清理。一旦引用的对象不再需要,就要调用IDisposable.Dispose方法,这最终是客户端程序员的工作。因为你的Disposp方法很可能与Finalize方法执行同样的工作,在你Dispose方法内可以通过调用System.GC.SuppressFinalize方法,以消除这种冗余终结行为,如示例5.20所示。
示例:5.20,实现Dispose
示例5.21是一个客户端在使用完对象后,显式地在该对象上调用Dispose力法。为了确保即使是在遇到异常的时候,对象的使用者总是会调用Dispose方法,c#编程语言提供了一个构件,它封装了带有终结处理程序(隐式地为你调用Dispose)的IDisposable兼容的(IDisposable-compatible)变量声明。这个构件就是c#的using语句。
示例5.21引用及确定的终结
class App{
static void Main(){
Transaction tx=new Transaction();
Console.WriteLine(tx.ID);
tx.Dispose(); //事务的同步失没败
}
}
图5.18展示了uslne语句的语法。using语句允许程序员声明一个或多个变量,它们的IDisposable.Dispose方法将会被自动调用。资源获得从句的语法与局部变量声明语句的语法很相似。你可以声明多个变量,但每个变量的类型都必须相司。示例5.22显示了uslng语句的—个简单用法。注意在该示例中,因为using语句与IDisposable兼容的对象一起被使用,所以,编译器会发射代码,确保即使是在遇到没有被处理的异常或者其他方法终结(例如,一个return语句)时,Dispose方法也会被调用。
示例5.22 C#的using语句
Class App{
Static void Main()
{
Using Transaction tx=new Transaction(){
Console.WriteLine(tx.id);
} //这里自动调用IDisposable.Dispose
//下面的代码与前面的using语句的功能一样
Transaction tx=new Transaction();
Try
{
Console.WriteLine(tx.id);
}
Finally{
If(tx!=null)((IDisposable)tx).Dispose();
}
}
}
我们走到哪儿了 对象(object)是多态的实体,CLR总是把它分配在堆上。值(value)只是格式化的内存单元,作为声明上下文或作用域的一部分被分配。对象和值都支持相等性(equivalence)和排序(ordering)的概念,但只有对象真正支持同一性( identity)的概念。尽管可以将值作为对象使用(或者将对象作为值使用),但是,使用实例的恰当形式,将会使编程模型更容易一些。P