赞
踩
finally块需要配合try块使用。
这个try块可是是有catch块,也可以是没有catch块的。
如果try没有异常,或是catch没有捕获到异常,那么在try执行完毕后执行finally块。
如果触发了异常且catch块捕获到了异常,那么在这个catch块执行完毕后执行finally块。
总之,finally块执行一个收尾工作,只能写在所有catch块的后面(如果有catch块)。
finally块总会执行,即便try中有一个return,finally也会在结束函数前执行。
int[] i = GetInt(); Console.WriteLine("主函数中的" + i[0]); int[] GetInt() { int[] i = new int[1]; try { return i; } finally { i[0] = 11; Console.WriteLine(i[0]); } }
通常,finally块是用于关闭流的。
这个using语句不是和命名空间交互的,而是和接口IDisposable交互的。
通常,涉及到常驻流的类,会实现这个接口。
这个接口的主要功能只有一个:关闭。
在c#中,如果访问文件,访问网页,如果一个方法是即刻完成的,那么直接调用就行了。
但如果是创建一个对象持续访问,那么会锁住这个文件/端口。
被锁住的文件/端口无法被其他程序使用。甚至这个程序本身都无法创建另一个访问。
{
var a = File.Open("X:\\a.txt", FileMode.Open);
Console.ReadLine();
}
Console.WriteLine("已经离开文件访问的作用域");
Console.ReadLine();
.NET有内存管理机制。但自动清理内存并不是实时的。
那么在这个对象出了作用域,但没有进行垃圾清理的时候,这个文件/端口仍然是锁住的。
像这样的,涉及到流的类,会实现这个接口。
像这样的类,通常有一个关闭方法。
var a = File.Open("X:\\a.txt", FileMode.Open);
a.Close();
这是他本身写好的。
此外,还有一个是释放方法。
var a = File.Open("X:\\a.txt", FileMode.Open);
a.Dispose();
这个方法的内容,通常和上面的方法一样,甚至就是调用那个方法。
这个方法,就是为了实现IDisposable接口做的方法。
不过通常,这些类还有一个终结器。终结器会在垃圾回收时候调用。
内容还是调用上面两个方法。就是怕你不记得对文件/端口取消占用。后果是很严重的。
在声明变量时,在类型前面加上using,那么在这个变量出作用域时,会自动调用他的Dispose方法。
{
using var a = File.Open("X:\\a.txt", FileMode.Open);
Console.ReadLine();
}
Console.WriteLine("已经离开文件访问的作用域");
Console.ReadLine();
其效果等同于
{
var a = File.Open("X:\\a.txt", FileMode.Open);
try
{
Console.ReadLine();
}
finally
{
((IDisposable)a).Dispose();
}
}
Console.WriteLine("已经离开文件访问的作用域");
Console.ReadLine();
这要求:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。