一、IDisposable例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace 资源回收
{class Program{static void Main(string[] args){using (Telphone t1 = new Telphone()){t1.Open();t1.Speak("hello");t1.Bomb();//t1.Dispose();t1.Open();t1.Speak("I am back!");//t1.Close();//可以不close,Dispose中会自动帮我们Close}Console.ReadKey();}}class Telphone : IDisposable{private TelphoneState state;public void Open(){if (state == TelphoneState.Disposed){throw new Exception("电话线已经被剪断,无法打开!");}state = TelphoneState.Open;Console.WriteLine("拿起电话");}public void Speak(string s){if (state != TelphoneState.Open){throw new Exception("没有连接");}Console.WriteLine(s);}public void Bomb(){state = TelphoneState.Close;Console.WriteLine("挂掉电话");}#region IDisposable 成员public void Dispose(){if (state == TelphoneState.Open){Bomb();}state = TelphoneState.Disposed;Console.WriteLine("剪断电话线");}#endregion}enum TelphoneState{Open,Close,Disposed}
}
1、使用using进行资源管理。
2、Dispose中通常会顺便调用Close,这只是实现类自己的行为,没人强求, IDisposable中的 Dispose方法根本不知道Close方法的存在,甚至可以没有close方法。(Close与Dispose的关系,常考)。没有规定Dispose一定会调用Close方法,但是很多的实现了IDisposable接口的方法中,通常都是代为调用Close之类的方法。一般的close只是关闭,也许关闭后还能打开,但是Dispose一般就表示资源被回收了,再也没法用了。有的类可能没有close方法。
Close和Dispose的区别:
1、一个类如果实现IDisposable接口,则肯定有Dispose这个方法。 但是一个类可以没有Close方法,也可以不叫Close。
2、即使像SqlConnection、FileStream这种有Close也有Dispose方法的,IDisposable接口也没有约定Dispose必须帮助Close,只不过一般的Dispose的实现都判断是否Close,如果没有Close则帮助Close,但是这是好心、不是义务。