EffectiveC#15--使用using和try/finally来做资源清理

1.任何时候你在使用一个有Dispose()方法的类型时,你就有责任来调用Dispose()方法来释放资源。

最好的方法来保证Dispose()被调用的结构是使用using语句或者try/finally块

public void ExecuteCommand( string connString, string commandString )
{   using ( SqlConnection myConnection = new SqlConnection( connString ))
      { using ( SqlCommand mySqlCommand = new SqlCommand(   commandString, myConnection ))
            {
             myConnection.Open();
             mySqlCommand.ExecuteNonQuery();
            }
        }
}

  翻译者认为上述结构问题在于无法捕获异常。建议如下写法,作者本人和译者相同。

public void ExecuteCommand( string connString, string commandString )
{   SqlConnection myConnection = null;
  SqlCommand mySqlCommand = null;
  try   {      myConnection = new SqlConnection( connString );
     mySqlCommand = new SqlCommand( commandString, myConnection ); myConnection.Open();
      mySqlCommand.ExecuteNonQuery();
  }   catch  {}
 finally
  {
    if ( mySqlCommand != null ) //注意这里判断对象是否为null是很重要的一些封装了COM的对象,有些时候的释放是隐式的,当你再释放一些空对象时会出现异常
         mySqlCommand.Dispose();
    if ( myConnection != null )
      myConnection.Dispose(); }
 }

sqlconnection它还有close(),Dispose方法会释放更多的资源,它还会告诉GC,这个对象已经不再须要析构了

2.使用或包含非托管资源的类型必须实现IDisposable接口的Dispose()方法来精确的释放系统资源。

时间: 2024-12-26 17:26:57

EffectiveC#15--使用using和try/finally来做资源清理的相关文章

Effective C++:条款15:在资源管理类提供对原始资源的访问

(一) 下面代码: tr1::shared_ptr<Investment> pInv(createInvestment()); int daysHeld(const Investment* pi); 我们要调用daysHeld函数的话,就必须传递一个Investment指针,但是我们现在只有pInv对象,所以我们需要一个函数可将RAII class(本例为tr1::shared_ptr)对象转换为其所内含之原始资源(本例). 有两种方法,一种是显式转换,另外一种是隐式转换. (二)显式转换 t

杭州电子地图 高清15、17、19级别 谷歌电子地图资源

杭州电子地图.下载与谷歌电子地图库.最高级别19级.商用级别17级别.预览图为15.17.19级别,百度网盘打开下载,假设须要很多其它电子地图请下载专业谷歌电子地图下载器. 百度网盘下载资源:http://pan.baidu.com/s/1eQu2vVc 谷歌电子地图下载器:http://www.arceyes.com/download/sggm.rar 百度电子地图下载器:http://www.arceyes.com/download/sgbdm.rar 万能地图下载器,下载包含电子地图.卫星

【python cookbook】【字符串与文本】15.给字符串中的变量名做插值处理

问题:想创建一个字符串,其中嵌入的变量名称会以变量的字符串值形式替换掉 解决方法:str.format().str.format_map() >>> s = '{name} has {n} messages.' >>> s.format(name='Guido',n=37) 'Guido has 37 messages.' >>> name='Guido' >>> n=37 >>> s.format_map(vars

通过批处理文件使用7zip执行备份,将1日和15日的备份再另外备份,定时清理过期备份

7z.exe是个好东东,N多年前,当时试用了各种命令行压缩软件,效果都不怎么样,那时7zip出来不久,发现它也有命令行模式,然后试用一下,发现可用性很好,压缩率.效率也很不错.当时试用过winrar和rar,效果都不太好. C:\7-Zip\7z.exe a -sdel "E:\Backup\Zip_%date:~0,4%_%date:~5,2%_%date:~8,2%.7z" "E:\Backup\%date:~0,4%_%date:~5,2%_%date:~8,2%.dm

go 函数和流程控制

if/else分支判断 基本结构如下: 1 if condition1 { 2 } 3 4 if condition1 { 5 6 } else { 7 8 } 9 10 if condition1 { 11 12 } else if condition2 { 13 14 } else if condition3 { 15 } else { 16 } 1 // main 2 package main 3 4 import ( 5 "fmt" 6 "strconv"

Effective C++——条款15(第3章)

条款15:    在资源管理类中提供对原始资源的访问 Provide access to raw resources in resources-managing classes 资源管理类(resource-managing classes)很棒.它们是对抗资源泄露的堡垒.在一个良好的环境中将依赖这样的classes来处理和资源之间的所有互动.而不是直接处理原始资源,但这个环境并不完美,许多API直接涉及资源,因此有时只能绕过资源管理对象直接访问原始资源(raw resources). 例如,条

超棒的 15 款 Bootstrap UI 编辑器

自从 2011 年 Mark Otto 和 Jacob Thornton 开发了  Bootstrap,我们第一次接触并熟知了 Bootstrap .这些都归功于  Twitter!从那以后,它就非常流行并且成为了最好的响应式框架之一.Bootstrap 帮助开发者快速高效的开启大量新的 web  项目,受到了广大开发者们的青睐. 为了照顾那些不是很熟悉 Bootstrap 但是又想继续深入了解的开发者,我们在这里简单的介绍一下.Bootstrap 是一个 pre-styled 组件的扩展库,有

第 15 章 应用本地化

请参考教材,全面理解和完成本章节内容... ... 复制工程ch13,将工程目录改名为ch14. 本地化是一个基于设备语言设置,为应用提供合适资源的过程.本章我们将对HelloMoon应用进行本地化,并为其提供中文版本的字符串资源.当设备的语言被设置为中文时,Android会自动找到并使用相应的中文资源,如图15-1所示. 图15-1 你好, 月球 15.1 本地化资源 语言设置是设备配置的一部分.Android提供了用于不同语言的配置修饰符.本地化处理因而变得简单:首先创建带有目标语言配置修饰

Android BaseAdapter加载多个不同的Item布局时出现UncaughtException in Thread main java.lang.ArrayIndexOutOfBoundsException: length=15; index=15

java.lang.ArrayIndexOutOfBoundsException: length=15; index=15 异常出现的场景:在做聊天界面时,需要插入表情,图片,文字,名片,还有几种较为复杂的布局.这时就需要用到BaseAdapter中的getViewTypeCount()和getItemViewType(int position) 方法了,在发送复杂界面时出现了这个异常. 令人抓狂的是这个异常居然是UncaughtException,根本无法判断哪一行出错了,刚开始的时候觉得一定