深入了解C#系列:谈谈C#中垃圾回收与内存管理机制(3)
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。