欢迎来到天天文库
浏览记录
ID:52267775
大小:277.50 KB
页数:30页
时间:2020-04-03
《Net面向对象程序设计-14-使用垃圾回收和资源管理.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、.NET面向对象程序设计第14章使用垃圾回收和资源管理本章简介使用GC编写代码,用析构器终结一个对象时运行这些代码编写try/finally语句编写using语句14.1对象的生存期对象的创建示例:SquaremySquare=newSquare();从开发人员的角度看,new是一个原子级的操作在最底层,对象的创建实际分两步走:首先,new操作必须从heap中分配一些原始内存,在创建对象阶段,你无法进行任何干涉然后,new操作必须将那些原始内存转换成一个对象,它必须初始化对象,在构造器的帮助下,
2、可以对这一阶段进行控制创建对象后,可以使用.操作符访问它的成员可以让其他引用变量引用同一个对象销毁对象也分两步走首先,runtime必须执行一些清理工作,在一个析构器destructor的帮助下,你可以对这一阶段进行控制然后,runtime必须将之前被对象占有的内存归还给堆,对象的内存必须回收,同样,你对这一阶段仍然没有任何控制权销毁一个对象,并将内存归还给堆的过程称为垃圾回收(garbagecollection)5示例:01:usingSystem;02:03:classAccount04:{
3、05:06:}07:08:classBank09:{10:privateAccountbankAccount;11:12:publicvoidSetAccount(AccountnewAccount)13:{14:bankAccount=newAccount;15:}16:}17:18:classTester19:{20:publicstaticvoidMain()21:{22:Bankbank1;24:Accountaccount1;25:Accountaccount2;27:account1
4、=newAccount();29:account1=null;31:account1=newAccount();32:account2=newAccount();34:account1=account2;36:bank1=newBank();37:bank1.SetAccount(newAccount());39:bank1=null;41:DoingAccountStuff();42:}44:publicstaticvoidDoingAccountStuff()45:{46:Accountlo
5、calAccount;47:localAccount=newAccount();48:}49:}61、将null引用赋值给对象的所有引用72、将一个表示对对象A的唯一引用的应用变量赋值给另一个不同的引用对象时,对象A被废弃83、当对象A包含对象B的唯一引用时,若废弃对象A时,对象A和对象B都被废弃4、当一个包含对某对象的唯一引用的本地变量越过作用域时,此对象就会被废除14.1.1编写析构器使用析构器,可以执行对象被垃圾回收时需要执行的任何清理工作析构器也是一个特殊的方法,只是runtime会在一
6、个对象的最后一个引用消失后调用它publicstaticintInstanceCount(){returnthis.instanceCount;}...privatestaticintinstanceCount=0;}classTally{publicTally(){this.instanceCount++;}~Tally(){this.instanceCount--;}C#无需太多的内存管理。这是因为.NETFramework垃圾回收器会隐式地管理对象的内存分配和释放。但是,当应用程序封装窗口
7、、文件和网络连接这类非托管资源时,应当使用析构函数释放这些资源。当对象符合析构时,垃圾回收器将运行对象的Finalize方法。析构器存在一些非常重要的限制析构器只适用于引用类型,不能在值类型中声明析构器structTally{~Tally(){...}//compile-timeerror}不能为析构器指定一个访问修饰符,因为你永远不在自己的代码中调用析构器-总是由垃圾回收器来帮你调用public~Tally(){...}//compile-timeerror析构器不能获取任何参数,同样的,这是
8、由于你永远不由你自己调用析构器~Tally(intparameter){...}//compile-timeerror内部,编译器自动将一个析构器转换成对Object.Finalize方法的一个重写版本编译器将以下析构器classTally{~Tally(){//yourcodegoeshere}}转换成以下形式classTally{protectedoverridevoidFinalize(){try{//yourcodegoeshere}finally{base.Finalize();}}}
此文档下载收益归作者所有