深入了解C#系列:谈谈C#中垃圾回收与内存管理机制(3)
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.Data;
5
using 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()方法,主动释放。
11
namespace 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。

