c#中的析构与IDisposeable小例

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace IDisposeDemo
  5. {
  6.     /**
  7.      * C#中不建议使用析构函数来释放资源,因为
  8.      * 1 析构函数的执行时间不确定,不会像c++一样在引用失效时立即调用..
  9.      * 2 使用析构函数会造成性能的浪费,析构函数会使GC两次才能真正释放资源,
  10.      *   如果没有析构函数,在失去引用时,GC执行时,堆中就会被清除,但是有析构函数,就会在第一次先执行析构函数,第二次释放堆
  11.      * */
  12.     /*
  13.      * IDisposeable接口显示释放资源是一种C#推荐方式,这样不会存在析构函数与GC之前那样的问题
  14.      *     class Program
  15.     {
  16.         static void Main(string[] args)
  17.         {
  18.             Person p = null;
  19.           
  20.             try
  21.             {
  22.                 p = new Person();
  23.                 p.Name = "aladdinty";
  24.                 p.Age = 20;
  25.             }
  26.             finally
  27.             {
  28.                 if (p != null)
  29.                 {
  30.                     p.Dispose();
  31.                 }
  32.             }
  33.         }
  34.     }
  35.      * 
  36.      * 以上示例写法,容易造成代码混淆,增加代码量
  37.      * C#中使用using关键字可以简单化这个过程,不用手动调用方法
  38.      *      using (Person p = new Person())
  39.             { 
  40.             
  41.             }
  42.      * 
  43.      * 只要在using作用域结束时,系统就会自动调用销毁方法
  44.      **/
  45.     class Program
  46.     {
  47.         static void Main(string[] args)
  48.         {
  49.             using (Person p = new Person())
  50.             { 
  51.             
  52.             }
  53.             //Person p = null;
  54.           
  55.             //try
  56.             //{
  57.             //    p = new Person();
  58.             //    p.Name = "aladdinty";
  59.             //    p.Age = 20;
  60.             //}
  61.             //finally
  62.             //{
  63.             //    if (p != null)
  64.             //    {
  65.             //        p.Dispose();
  66.             //    }
  67.             //}
  68.             Console.Read();
  69.         }
  70.     }
  71.     class Person:IDisposable
  72.     {
  73.         private string name;
  74.         private int age;
  75.         public Person()
  76.         {
  77.     
  78.         }
  79.         //析构函数
  80.         ~Person()
  81.         {
  82.             Console.WriteLine( "老纳让人家给回收了") ;
  83.         }
  84.         public string Name
  85.         {
  86.             get
  87.             {
  88.                 return this.name;
  89.             }
  90.             set
  91.             {
  92.                 this.name = value;
  93.             }
  94.         }
  95.         public int Age
  96.         {
  97.             get
  98.             {
  99.                 return this.age;
  100.             }
  101.             set
  102.             {
  103.                 this.age = value;
  104.             }
  105.         }
  106.         #region IDisposable 成员
  107.         public void Dispose()
  108.         {
  109.             //这里释放本类使用过的非托管资源
  110.             Console.WriteLine( "读人家文件不关哪行了,关了");
  111.         }
  112.         #endregion
  113.     }
  114. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值