谈C# using的用法与好处

之前的一篇文章中的代码中有一个using的用法,刚开始查看了一些资料说是强制关闭对象的一个命令。今天又查了一些资料,才明白,原来using指令调用了一个方法——Dispose()方法。而Dispose()方法的作用就是释放所有的使用资源。

例:

public void ExecuteCommand( string connString, string commandString )
{
 SqlConnection myConnection = new SqlConnection( connString );
 SqlCommand mySqlCommand = new SqlCommand( commandString,
  myConnection ); 

 myConnection.Open();
 mySqlCommand.ExecuteNonQuery();
} 

这个例子中的两个可处理对象没有被恰当的释放:SqlConnection和SqlCommand。两个对象同时保存在内存里直到析构函数被调用。

解决这个问题的方法就是在使用完命令和链接后就调用它们的Dispose:

public void ExecuteCommand( string connString, string commandString )
{
 SqlConnection myConnection = new SqlConnection( connString );
 SqlCommand mySqlCommand = new SqlCommand( commandString,
  myConnection ); 

 myConnection.Open();
 mySqlCommand.ExecuteNonQuery(); 

 mySqlCommand.Dispose( );
 myConnection.Dispose( );
} 

使用using语句也可以很好的实现此功能,而且代码很清晰:

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

当你在一个函数内使用一个可处理对象时,using语句是最简单的方法来保证这个对象被恰当的处理掉。当这些对象被分配时,会被编译器放到一个try/finally块中。

SqlConnection myConnection = null; 

// Example Using clause:
using ( myConnection = new SqlConnection( connString ))
{
 myConnection.Open();
} 

// example Try / Catch block:
try {
 myConnection = new SqlConnection( connString );
 myConnection.Open();
}
finally {
 myConnection.Dispose( );
}

有时候使用try/finally块的时候会发现如果发生错误,程序不会报错。本人感觉还是使用using语句比较好。
以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • C#中using指令的几种用法

    C#中using指令的用法 1.using指令 using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到. 例如: using System; using System.Data; 2.using别名 using + 别名 = 包括详细命名空间信息的具体的类型. 这种做法有个好处就是当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候.当需要用

  • Tomcat ssl报错Connector attribute SSLCertificateFile must be defined when using SSL with APR解决方法

    今天同事要求帮忙配置tomcat ssl,直接把linux下tomcat配置ssl这篇文章发给他了,没想到他居然说启动tomcat的时候,报Connector attribute SSLCertificateFile must be defined when using SSL with APR的错误,马上跑过去看,原来他的tomcat版本是7.0的,我发给他的是tomcat6的,检查了key,检查了配置文件,因为他直接复制的我发他文章的配置,折腾了2-3个小时,终于把问题给解决了. 系统:wi

  • MYSQL ERROR 1045 (28000): Access denied for user (using password: YES)问题的解决

    第一种方法: 推荐错误描述: Mysql中添加用户之后可能出现登录时提示ERROR 1045 (28000): Access denied for user的错误. 原因分析: 在mysql.user表中可能出现user为空的记录,如: mysql> select host,user from user; +------------------+------+ | host | user | +------------------+------+ | % | test | | localhost

  • 不能忽略c#中的using和as操作符的用处

    是不是很多人不用c#中的using和as操作符?甚至不知道?  其实这2个操作符在小处非常有用. 1.using  按照msdn的解释 using 语句定义一个范围,在此范围的末尾将处理对象.  举例: class TestUsing:IDisposable      {          public void Dispose()           {              Console.WriteLine("Dispose");           } public voi

  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型. 为命名空间创建别名. using 关键字还用来创建 using 语句  定义一个范围,将在此范围之外释放一个或多个对象. 请参见 using 语句.http://www.yaosansi.com/blog/article.asp?id=669 using namespace; using alias = type|namespace;  参数 Alias  您希望用来表示命名空间或类型的用户定义符号

  • JS中简单的实现像C#中using功能(有源码下载)

    先看看使用页面是如何调用的. 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">   <head>   <title> 

  • 找不到类型或命名空间名称“Server”(是否缺少 using 指令或程序集引用?)

    今天将webserice里面的一个代码,拷到一个C#类,结果运行编译错误.DataBase = Server.MapPath("data.mdb");报错:找不到类型或命名空间名称"Server"(是否缺少 using 指令或程序集引用?) 但是我的确引用了名字空间using System.Web;为什么呢?因为Server的完整路径是System.Web.HttpContext.Current.Server.using System.Web是显然不够的:但是在从内

  • C# using三种使用方法

    C# using 三种使用方式介绍 1.using指令.using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到. 例如:using System; 一般都会出现在*.cs中. 2.using别名.using + 别名 = 包括详细命名空间信息的具体的类型. 这种做法有个好处就是当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候.当需要用到这

  • C++ using namespace std 用法深入解析

    一 :<iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的. 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h. 因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就

  • mysql Access denied for user ‘root’@’localhost’ (using password: YES)解决方法

    今天在启动mysql时出现以下问题: [root@www ~]# mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 网上的答案是各种各样的,最终解决问题的方法总结为以下,好多都是没有设置初始密码造成此问题的. 解决方法如下: [root@www ~]# service mysqld stop #先关闭mysql服务

随机推荐