|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。系列文章目次索引:《.NET,你健忘了么》
我们都晓得,渣滓接纳能够分为Dispose和Finalize两类,关于这二者的区分已太多了,一个是一般的渣滓接纳GC所挪用的办法,别的一个是闭幕器Finalizer,所挪用的办法,在EffectiveC#一书中,有着明白的倡议是说利用IDispose接口来取代Finalize。缘故原由是由于Finalize闭幕会增添渣滓接纳对象的代数,从而影响渣滓接纳。
有了上述的缘故原由,我们如今只来看利用IDispose接口的类。
在.NET中,尽年夜多半的类都是运转在托管的情况下,以是都由GC来卖力接纳,那末我们就不必要完成IDispose接口,而是由GC来主动卖力。但是有一些类利用的长短托管资本,那末这个时分,我们就应当往完成IDispose接口,说个对照经常使用的SqlConnection之类。
写段经常使用的毗连SQL语句的模子:- stringconnectionString=System.Configuration.ConfigurationManager.ConnectionStrings["Study1ConnectionString1"].ConnectionString;SqlConnectionthisConnection=newSqlConnection(connectionString);thisConnection.Open();SqlCommandthisCommand=newSqlCommand();thisCommand.Connection=thisConnection;thisCommand.CommandText="select*from[User]";thisCommand.ExecuteNonQuery();thisConnection.Close();
复制代码 实在,作为非托管资本,为了避免我们健忘挪用Close,一样平常都完成了Finalize,因而,即便我们没有Close失落,也会由闭幕器将这块内存接纳。可是,就增添了这块渣滓的代数。
假定说我们写了如许的代码:- stringconnectionString=System.Configuration.ConfigurationManager.ConnectionStrings["Study1ConnectionString1"].ConnectionString;SqlConnectionthisConnection=newSqlConnection(connectionString);thisConnection.Open();SqlCommandthisCommand=newSqlCommand();thisCommand.Connection=thisConnection;thisCommand.CommandText="select*form[User]";//SQL语句毛病thisCommand.ExecuteNonQuery();thisConnection.Close();
复制代码 如许的话,我们翻开的SqlConnection就没有封闭,只能守候Finalize往封闭了。
这长短常欠好的做法。因而,我们能够想到非常处置:- SqlConnectionthisConnection=null;try{stringconnectionString=System.Configuration.ConfigurationManager.ConnectionStrings["Study1ConnectionString1"].ConnectionString;thisConnection=newSqlConnection(connectionString);thisConnection.Open();SqlCommandthisCommand=newSqlCommand();thisCommand.Connection=thisConnection;thisCommand.CommandText="select*form[User]";thisCommand.ExecuteNonQuery();}finally{if(thisConnection!=null){thisConnection.Close();}}
复制代码 如许做就不错了,可是代码看起来有些丑恶,但是利用using就让代码文雅了良多,这也是C#比JAVA棒良多的中央,呵呵!- stringconnectionString=System.Configuration.ConfigurationManager.ConnectionStrings["Study1ConnectionString1"].ConnectionString;using(SqlConnectionthisConnection=newSqlConnection()){thisConnection.Open();SqlCommandthisCommand=newSqlCommand();thisCommand.Connection=thisConnection;thisCommand.CommandText="select*form[User]";thisCommand.ExecuteNonQuery();}
复制代码 代码量是否是小了良多呢?文雅了很多呢!
实在,在IL的地位,代码仍旧是一样的,他一样把代码给编译成了try-finally的处置情势!
接上去,再来看下我们经常使用的利用数据库的体例:- stringconnectionString=System.Configuration.ConfigurationManager.ConnectionStrings["Study1ConnectionString1"].ConnectionString;SqlConnectionthisConnection=newSqlConnection(connectionString);thisConnection.Open();SqlCommandthisCommand=newSqlCommand();thisCommand.Connection=thisConnection;thisCommand.CommandText="select*from[User]";SqlDataReaderthisReader=thisCommand.ExecuteReader();thisReader.Close();thisConnection.Close();
复制代码 仍是下面的成绩,我们思索用using语句来将之代码重构:- stringconnectionString=System.Configuration.ConfigurationManager.ConnectionStrings["Study1ConnectionString1"].ConnectionString;using(SqlConnectionthisConnection=newSqlConnection(connectionString)){thisConnection.Open();SqlCommandthisCommand=newSqlCommand();thisCommand.Connection=thisConnection;thisCommand.CommandText="select*from[User]";using(SqlDataReaderreader=thisCommand.ExecuteReader()){while(reader.Read()){//操纵}}}
复制代码 我先把这段代码翻译成我们熟习的try-finally的处置情势:- SqlConnectionthisConnection=null;try{stringconnectionString=System.Configuration.ConfigurationManager.ConnectionStrings["Study1ConnectionString1"].ConnectionString;thisConnection=newSqlConnection(connectionString);thisConnection.Open();SqlCommandthisCommand=newSqlCommand();thisCommand.Connection=thisConnection;thisCommand.CommandText="select*from[User]";SqlDataReaderreader=null;try{reader=thisCommand.ExecuteReader();while(reader.Read()){//操纵}}finally{reader.Close();}}finally{thisConnection.Close();}
复制代码 更丑恶的代码吧!以是有个准绳是:只管制止using语句的嵌套。
怎样办理呢?很简单,本人写我们的try-finally吧!- SqlConnectionthisConnection=null;SqlDataReaderreader=null;try{stringconnectionString=System.Configuration.ConfigurationManager.ConnectionStrings["Study1ConnectionString1"].ConnectionString;thisConnection=newSqlConnection(connectionString);thisConnection.Open();SqlCommandthisCommand=newSqlCommand();thisCommand.Connection=thisConnection;thisCommand.CommandText="select*from[User]";reader=thisCommand.ExecuteReader();while(reader.Read()){//操纵}}finally{if(thisConnection!=null){thisConnection.Close();}if(reader!=null){reader.Close();}}
复制代码 如许就行了!
关于using的这节我就写到这,最初对全文做个总结,实在就是一句话:只管利用using来举行非托管资本的资本接纳。
来自:http://www.ckuyun.com/xinyuperfect/archive/2009/03/02/1401409.html
说句实话,net网页编程跨平台根本就不是外行人想想的那种,一次编译,处处运行。 |
|