namespace 资源回收
{
class Program
{
static void Main(string[] args)
{
//使用using对实现IDisposable的类了进行资源管理
/*拿到一个对象的时候,首先判断这个对象是否实现了IDisposable接口,如果实现了,最好就用using包裹住这个对象,保证这个对象用完之后被释放掉,否则很可能出现资源泄露的问题
*/
using (Telphone t1 = new Telphone())
{
t1.Open();
t1.Speak("hello");
t1.Bomb();
//t1.Dispose();//如果在这里调用了Dispose()方法释放资源,那么在执行t1.Open()方法就出错,电话线已经被剪断了,无法再打电话了
t1.Open();
t1.Speak("I am back!");
}//代码执行到这里后,就会调用Dispose方法来进行资源回收
Console.ReadKey();
}
}
/// <summary>
/// Telphone类实现了IDisposable接口
/// </summary>
class Telphone : IDisposable
{
/// <summary>
/// 电话状态
/// </summary>
private TelphoneState state;
/// <summary>
/// 打电话
/// </summary>
public void Open()
{
if (state == TelphoneState.Disposed)
{
throw new Exception("电话线已经被剪断,无法打开!");
}
state = TelphoneState.Open;
Console.WriteLine("拿起电话");
}
/// <summary>
/// 说话
/// </summary>
/// <param>说话内容</param>
public void Speak(string s)
{
if (state != TelphoneState.Open)
{
throw new Exception("没有连接");
}
Console.WriteLine(s);
}
/// <summary>
/// 挂掉电话
/// </summary>
public void Bomb()
{
state = TelphoneState.Close;
Console.WriteLine("挂掉电话");
}
IDisposable 成员
}
/// <summary>
/// 电话状态枚举
/// </summary>
enum TelphoneState
{
Open, Close, Disposed
}
}
程序运行结果如下图所示:
三、析构函数和IDisposable混合调用的例子
复制代码 代码如下: