当前位置:   article > 正文

c#入门-finally块和using语句_c# finally

c# finally

finally块

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]);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

通常,finally块是用于关闭流的。

using语句

这个using语句不是和命名空间交互的,而是和接口IDisposable交互的。
通常,涉及到常驻流的类,会实现这个接口。

这个接口的主要功能只有一个:关闭。

持续流

在c#中,如果访问文件,访问网页,如果一个方法是即刻完成的,那么直接调用就行了。
但如果是创建一个对象持续访问,那么会锁住这个文件/端口。
在这里插入图片描述
被锁住的文件/端口无法被其他程序使用。甚至这个程序本身都无法创建另一个访问。

{
	var a = File.Open("X:\\a.txt", FileMode.Open);
	Console.ReadLine();
}
Console.WriteLine("已经离开文件访问的作用域");
Console.ReadLine();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

.NET有内存管理机制。但自动清理内存并不是实时的。
那么在这个对象出了作用域,但没有进行垃圾清理的时候,这个文件/端口仍然是锁住的。

像这样的,涉及到流的类,会实现这个接口。

手动关闭流

像这样的类,通常有一个关闭方法。

var a = File.Open("X:\\a.txt", FileMode.Open);
a.Close();
  • 1
  • 2

这是他本身写好的。
此外,还有一个是释放方法。

var a = File.Open("X:\\a.txt", FileMode.Open);
a.Dispose();
  • 1
  • 2

这个方法的内容,通常和上面的方法一样,甚至就是调用那个方法。
这个方法,就是为了实现IDisposable接口做的方法。

不过通常,这些类还有一个终结器。终结器会在垃圾回收时候调用。
内容还是调用上面两个方法。就是怕你不记得对文件/端口取消占用。后果是很严重的。

using自动关闭

在声明变量时,在类型前面加上using,那么在这个变量出作用域时,会自动调用他的Dispose方法。

{
	using var a = File.Open("X:\\a.txt", FileMode.Open);
	Console.ReadLine();
}
Console.WriteLine("已经离开文件访问的作用域");
Console.ReadLine();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其效果等同于

{
	var a = File.Open("X:\\a.txt", FileMode.Open);
	try
	{
		Console.ReadLine();
	}
	finally
	{
		((IDisposable)a).Dispose();
	}
}
Console.WriteLine("已经离开文件访问的作用域");
Console.ReadLine();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这要求:

  1. 声明变量一定要是一个单独的语句,不能是模式匹配的声明模式,
    或是析构元组,捕获异常,out参数声明赋值的变量。
  2. 可以判断作用域,会在离开作用域时调用Dispose方法
  3. 一定要可以转化为IDisposable接口,才能自动调用IDisposable接口上的方法。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号