本文介绍了C#中using语句的用法,并通过示例代码进行了详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。
一、using语句
使用可视为中的新语法元素。NET,它清楚地解释了一个资源密集型对象什么时候会被使用和手动释放。当可以使用using时,建议尽可能使用using语句。到目前为止,使用using语句只给程序员带来了好处,没有坏处。
在。NET环境中,托管资源将由。而一些非托管资源需要程序员手动释放。NET提供了释放非托管资源的主动和被动方式,即IDisposable接口的Dispose方法和类型本身的Finalize方法。任何带有非托管资源的类型都需要实现IDisposable的Dispose方法,使用这些类型后,需要手动调用对象的Dispose方法来释放对象中的非托管资源。
如果类型正确地实现了Finalize方法,那么即使不调用Dispose方法,非托管资源最终也会被释放,但随后资源已经被无畏地占用了很长时间。
using语句的作用是提供一种高效的方法来调用object Dispose方法。对于任何类型的IDisposable接口,都可以使用using语句,但是对于那些没有实现IDisposable接口的类型,使用using语句会导致编译错误。
让我们先来看看using语句的基本语法:
使用(StreamWriter sw=new StreamWriter())
{
//中间处理逻辑
}
在上面的代码中,using语句在开头定义了一个StreamWriter对象,然后就可以在整个语句块中使用sw了。在using语句块的末尾,将自动调用sw的Dispose方法。using语句不仅消除了程序员输入Dispose调用代码的需要,而且提供了一种机制来确保调用Dispose方法,无论using语句块是成功执行还是引发了异常。下面的代码演示了使用的这种保护机制。
使用系统;
命名空间使用演示
{
班级计划
{
静态void Main(string[] args)
{
尝试
{
//使用using
使用(MyDispose md=new MyDispose())
{
MD . DoWork();
//使用引发异常进行测试
抛出新异常(“抛出异常”);
}
}
捕捉
{
}
最后
{
控制台。read key();
}
}
}
///摘要
///从IDisposable接口继承而来,只用于没有任何非托管资源的测试。
////摘要
公共类MyDispose : IDisposable
{
公共void Dispose()
{
控制台。WriteLine(“Dispose Dispose方法被调用”);
}
public void DoWork()
{
控制台。WriteLine('做了很多工作');
}
}
}
在上面的代码中,using语句块引发了一个异常,该异常直到using语句完成后才被捕获。由于using语句,即使抛出异常,MyDispose的对象md的DIspose方法仍然被调用。程序输出结果如下:
实际上,C#编译器会自动为using语句添加一个try/finally块,这样Dispose方法就可以被调用到,所以下面两段代码编译后会完全一致:
使用(MyDispose md=new MyDispose())
{
MD . DoWork();
}
和
MyDispose md
尝试
{
MD=new my dispose();
MD . DoWork();
}
最后
{
MD . Dispose();
}
在彻底理解了using的实现原理之后,还应该注意使用using时经常犯的错误,即永远不要尝试在using语句块之外初始化对象,如下面的代码所示:
my dispose MD=new my dispose();
使用(md)
{
MD . DoWork();
}
看似没有问题,但在多线程程序中,上面的代码会有隐患。想象一下,当md初始化的时候,程序突然产生异常,被中断,那么md对象中的非托管资源将没有机会被释放,这对系统是相当有害的。因此,要使用的对象应该随时在using语句中初始化。
二、总结
using语句调用实现IDisposable的type对象的Dispose方法。using语句可以确保在using语句块的末尾调用used对象的Dispose方法,而不管是否引发异常。# C编译器在编译时自动在using语句中加入try/finally块,所以using的本质和异常捕捉语句是一样的,只是语法更简洁。using使用的所有对象都应在using语句启动后进行初始化,以确保所有对象都可以被释放。
关于在C#中使用using语句的这篇文章到此结束。希望对大家的学习有帮助,也希望大家多多支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。