使用using关键字来自动清除对象资源

本文介绍了C#中使用Using关键字进行资源管理的方法,包括如何声明对象、释放资源及与try/catch/finally语句的区别。文章还讨论了IDisposable接口的重要性,并通过示例展示了如何使用Using关键字优化数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用程序喜欢使用电脑中的资源,而不去考虑他们所使用的资源是否是数据库连接或者是内存中如同堆栈或数组一样的数据。当有必要的时候可以使用这些资源,但是要尽可能快的释放他们。.NET架构通过使用try/catch/finally来实现这个功能,但是许多开发者发觉反复输入这些语句是一件非常麻烦的事情。也有一些其他的方法可以解决这个繁琐的工作带来的困扰,但是仅仅适用于某些特定条件下。

对于using关键字的不同看法

如果你是用C#来开发,你就知道使用关键字,它可以使你的程序更简单的访问这些资源。例如,我如果需要声明一个网络的文本框控制,就需要输入一下语句:

System.Web.UI.WebControls.TextBox txtName;

另一方面,如果在代码最上方注明了使用的类型,就可以直接指定,而无需键入完整的路径,标注的类型状态可以是这样的:

Using System.Web.UI.WebControls;

如果标注类型使用上面的语句,那么就可以用下面的这条语句来代替上面第一条(System.Web.UI.WebControls.TextBox txtName; )语句:

TextBox txtName;

在C#里使用关键字。前面这个语句用于表明这段代码使用一个对象,在这段代码结束的时候,这个对象资源应该被释放掉。下面的代码给出了更好的范例:

Using (TestObject a = new TestObject())  {

// 使用对象

}

//调用释放对象的方法

在处理对象的时候,上面的代码比使用try/catch/finally 要简便的多:

try {

TestObject a = new TestObject();

// 使用对象

} catch (Exception e) {

// 处理异常

} finally {

TestObject.Dispose();

}

在这个语句中有一处警告,就是对象必须实现IDisposable这个接口。通过实现接口,你就为这种类型的实例分配它所需要的资源。

IDisposable

IDisposable接口定义了一个方法--一个释放方法--就是释放那些已被分配出去而并没有在使用的资源。如果你不想代码自动去调用一个不存在的方法,这个方法就显得非常有用。如果你对一个对象使用关键字,而此时还没有实现IDisposable接口,编译器就会返回错误信息。下面这个程序中使用的这个类就是实现IDisposable的代码:

public class TestObject: IDisposable  {

public TestObject() {

// 构建代码

}

public void Dispose() {

//  清除管理的资源

component.Dispose();

// 你同时需要清楚没有管理的资源

// 下面一行用于从队列中清除对象,以阻止其进一步的执行

GC.SuppressFinalize(this);

}

}

 

当你开发你自己的类的时候上面的语句才会派上用场,但是许多类已经具备上述的功能了。一个很好的例子就是与数据库连接在一起运行。

范例

数据是企业活力的源泉,几乎所有的应用程序都连接到了后方的数据。利用using语句来处理数据库对象可以为保存键值提供了机会(减少了try/catch/finally的开销)。并且,我利用微软数据接入应用程序块(DAAB)来进一步简化代码,下面摘录的代码显示了如何对于数据库连接使用using函数:

using ( SqlConnection conn = new SqlConnection(Global.CvoneConnection)

conn.Open();

using (SqlTransaction trans = conn.BeginTransaction())  {

try  {

SqlHelper.ExecuteNonQuery(trans, CommandType.StoredProcedure, "sp_name");

trans.Commit();

}  catch(Exception ex)  {

trans.Rollback();

throw ex;

}  }  }

 

代码通过一个数据库事务来传递一个命令给一个SQL数据库服务器(通过已保存的程序)。如果没有如到任何的异常,这个事务就会被接受。请注意,在using函数中,try/catch语言仍然在使用,因为对于处理回滚命令的时候catch是不可少的。同时,因为using函数可以实现清除数据库连接中的对象的操作,所以就不再使用finally函数了。结合使用using关键字和DAAB可以显著的减少代码的编写行数。

VB.NET开发者

当有人赞美C#的优点的时候VB.NET开发者经常会非常恼火,但是,就在我写这篇文章的时候,在VB.NET中还没有using函数。我曾经读过各种各样的关于VB.NET下一版本将会包含using关键字的报道,我们拭目以待。我希望using关键字将会包含在VB.NET中,因为它在某些情况下确实非常节省时间。

总是清除你的垃圾

最近我和一个客户一起工作,他经历过ASP.NET中漫长的等待时间,因为ASP.NET过多的依赖于SQL服务器。简简单单观察一下数据库服务器中打开的程序就会发现,ASP.NET应用程序打开了数据库连接但却没有关闭它们。在合适的时间关闭连接并释放有关的对象资源,可以大大提高程序的性能。using关键字也可以减轻这种情况的出现,但是VB.NET中却不包含有这种功能。

虽然说.NET架构提供了自动的碎片整理功能,并且可以发现许多以前老的C++开发者遭遇到的内存问题,但是在架构范围内使用完各种各样的资源以后你仍需要清理一下那些自己不需要的资源。


作者:Tony Patton,是一个拥有Java, VB, Lotus, and XML认证的应用程序开发专家。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值