C#中使用using关键字回收资源

发布时间:2023年12月30日

目录

一、一般表达式

二、示例

三、生成


????????在进行文件操作后要显式调用文件流的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释放对象资源。

文章来源:https://blog.csdn.net/wenchm/article/details/135298850
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。