目录
一、一般表达式
二、示例
三、生成
在进行文件操作后要显式调用文件流的Close方法释放文件资源,在使用数据库连接时也要调用连接对象的Close方法释放数据库资源。如果忘记调用Close方法,有可能会导致程序执行异常,而且还会导制垃圾收集器多次回收对象,造成内存的浪费。
一、一般表达式
using关键字可以用来引用命名空间,如using System。using关键字还有一种方便的功能,它可以帮助有效地回收对象资源。回收的资源包括文件资源、网络资源及数据库资源等。使用using关键字回收资源的工作原理非常简单。一般表达式:
using(Font f=new Font("Verdana",12,FontStyle.Regular))
{
//执行操作
}
说明:
using中的对象必须实现了IDisposable接口,也就是具有显式回收资源的能力;
相当于一下操作:
Font f=new Font("Verdana",12,FontStyle.Regular);
try
{
//执行操作
}
finally
{
if(f!=null)
{
((IDisposable)f).Dispose();
}
}
适用于清理单个非托管资源的情况,多个非托管资源对象的清理使用try-finally
如果多个非托管资源的对象类型一致,也可以使用using,使用方法如下:
using(Font f1=new Font("Verdana",12,FontStyle.Regular),Font f2=new Font("Arial",14,FontStyle.Bold))
{
//执行操作
}
使用 using关键字,先在其后的小括号中创建了一个Font类型的对象,using关键字要求小括号内产生的对象必须实现IDisposable接口或者其基类实现IDisposable接口,如果没有实现此接口,那么在编译时会出现错误。在using关键字下面的代码块执行完毕后,会自动将Font对象隐式转换为IDisposable接口类型,并调用接口方法Dispose释放对象资源。也可以使用using关键字同时回收多个对象资源。
二、示例
// 使用using关键字有效回收资源
namespace _024
{
public partial class Form1 : Form
{
private Button? button1;
public Form1()
{
InitializeComponent();
Load += Form1_Load;
}
private void Form1_Load(object? sender, EventArgs e)
{
SuspendLayout();
//
// button1
//
button1 = new Button
{
Location = new Point(83, 33),
Name = "button1",
Size = new Size(112, 23),
TabIndex = 0,
Text = "创建并回收资源",
UseVisualStyleBackColor = true
};
button1.Click += Button1_Click;
//
// Form1
//
AutoScaleDimensions = new SizeF(6F, 12F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(294, 82);
Controls.Add(button1);
Name = "Form1";
Text = "使用using关键字有效回收资源";
}
/// <summary>
/// 先在using后()中创建一个新的类型对象
/// 然后定义这个类的IDisposable接口
/// </summary>
private void Button1_Click(object? sender, EventArgs e)
{
using (new Test()) //在using语句中创建test对象
{
//using语句块执行完成后会自动调用test对象的Dispose方法
}
}
class Test : IDisposable //定义test类实现IDisposable接口
{
public void Dispose() //实现接口方法
{
MessageBox.Show("已经执行test对象的Dispose方法", "提示");
}
}
}
}
三、生成
虽然可以手动调用Close方法回收对象资源,但是使用using关键字更为简洁友好。在using关键字下面的代码块执行完毕后,会自动将using小括号中创建的对象隐式转换为IDisposable接口类型,并调用接口方法Dispose释放对象资源。