龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

深入了解C#系列:谈谈C#中垃圾回收与内存管理机制(3)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Data; 5 using MemoryManagement; 6 // CodedByFrankXuLei18/2/2009 7 // Studythe.NETMemoryManagement 8 // TestTheUn

1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.Data;
 5using MemoryManagement;
 6//Coded By Frank Xu Lei 18/2/2009
 7//Study the .NET Memory Management
 8//Test The Unmanaged Objects Reclaimed.
 9//针对非托管代码的测试,比较
10//托管代码,GC可以更具策略自己回收,也可以实现IDisposable,调用Dispose()方法,主动释放。
11namespace MemoryManagementClient
12{
13    class Program
14    {
15        static void Main(string[] args)
16        {
17
18            /////////////////////////////////////////(1)////////////////////////////////////////////
19            //调用Dispose()方法,主动释放。资源,灵活
20            FrankClassWithDispose _frankClassWithDispose = null;
21            try
22            {
23                _frankClassWithDispose = new FrankClassWithDispose();
24                _frankClassWithDispose.DoSomething();
25                
26            }

27            finally
28            {
29                if (_frankClassWithDispose!=null)
30                _frankClassWithDispose.Dispose();
31                //Console.WriteLine("FrankClassWithDispose实例已经被释放");
32            }

33                
34            /////////////////////////////////////////(2)//////////////////////////////////////////////
35            //可以使用Using语句创建非托管对象,方法执行结束前,会调用
36            using (FrankClassWithDispose _frankClassWithDispose2 = new FrankClassWithDispose())
37            {
38                //_frankClassWithDispose2.DoSomething();
39            }

40
41            /////////////////////////////////////////(3)////////////////////////////////////////////
42            //垃圾收集器运行的时候,一次就释放资源
43            FrankClassNoFinalize _frankClassNoFinalize = new FrankClassNoFinalize();
44            _frankClassNoFinalize.DoSomething();
45             
46            //////////////////////////////////////////(4)//////////////////////////////////////////////
47            //垃圾收集器运行的时候,两次才能够释放资源
48            FrankClassWithDestructor _frankClassWithDestructor = new FrankClassWithDestructor();
49            _frankClassWithDestructor.DoSomething();
50            ///////////////////////////////////////////(5)/////////////////////////////////////////////
51            //不能使用Using语句来创建对象,因为其没实现IDispose接口
52            //using (FrankClassWithDestructor _frankClassWithDestructor2 = new FrankClassWithDestructor())
53            //{
54            //    _frankClassWithDestructor2.DoSomething();
55            //}
56
57            //////////////////////////////////////////////////////////////////////////////////////
58            //For Debug
59            Console.WriteLine("Press any key to continue");
60            Console.ReadLine();
61
62        
63        }

64    }

65}

66

 有些时候资源必须在特定时间释放,类可以实现执行资源管理和清除任务方法IDisposable.Dispose的接口IDisposable。
如果调用者需要调用Dispose方法清理对象,类作为契约的一部分必须实现Dispose方法。垃圾收集器默认情况下不会调用
Dispose方法;然而,实现Dispose方法可以调用GC里的方法去规范垃圾收器的终结行为。

值得一提的是:调用Dispose()方法,主动释放资源,灵活,可以使用Using语句创建非托管对象,方法执行结束前,会调用
Dispose()方法释放资源,
这两端代码的效果是一样的,可以查看编译后IL。


收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!

热评话题

按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接