详细说一下C#中using自动释放资源的用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详细说一下C#中using自动释放资源的用法相关的知识,希望对你有一定的参考价值。

RT

using 语句(C# 参考)

定义一个范围,将在此范围之外释放一个或多个对象。

语法

using (Font font1 = new Font("Arial", 10.0f))


备注

C# 通过 .NET Framework 公共语言运行库 (CLR) 来自动释放用来存储不再需要的对象的内存。内存的释放具有不确定性;一旦 CLR 决定执行垃圾回收,就会释放内存。但是,通常最好尽快释放诸如文件句柄和网络连接这样的有限资源。

using 语句允许程序员指定使用资源的对象应当何时释放资源。为 using 语句提供的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。

可以在到达 using 语句的末尾时,或者在该语句结束之前引发了异常并且控制权离开语句块时,退出 using 语句。

可以在 using 语句中声明对象(如上所示),或者在 using 语句之前声明对象,如下所示:

Font font2 = new Font("Arial", 10.0f);
using (font2)

// use font2

可以有多个对象与 using 语句一起使用,但是必须在 using 语句内部声明这些对象,如下所示:

using (Font font3 = new Font("Arial", 10.0f),
font4 = new Font("Arial", 10.0f))

// Use font3 and font4.

示例

下面的示例显示用户定义类可以如何实现它自己的 Dispose 行为。注意类型必须从 IDisposable 继承。

using System;

class C : IDisposable

public void UseLimitedResource()

Console.WriteLine("Using limited resource...");


void IDisposable.Dispose()

Console.WriteLine("Disposing limited resource.");



class Program

static void Main()

using (C c = new C())

c.UseLimitedResource();

Console.WriteLine("Now outside using statement.");
Console.ReadLine();


C# 语言规范

有关更多信息,请参见 C# 语言规范中的以下各章节:

5.3.3.17 Using 语句

8.13 using 语句

请参见

参考
C# 关键字
extern(C# 参考)
命名空间关键字(C# 参考)
using 指令(C# 参考)

概念
C# 编程指南
命名空间(C# 编程指南)

其他资源
C# 参考
实现 Finalize 和 Dispose 以清理非托管资源
参考技术A using(A a = new A())

//使用A对象的方法

在作用域结束的时候,会自动调用A对象的Dispose方法
但是前提A对象必须实现了IDispose接口
否则无法使用using关键字

C# USING ADO.NET

作为一个初学者,内容摘自网络.

使用using,能在使用完之后,进行资源的自动释放。
例如:  SqlConnection conn = new SqlConnection(ConnStr);
            conn.Open();
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.ExecuteNonQuery();
            conn.Close();
            conn.Dispose();
与下面的语句是等效的:
using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(sql, conn);
                cmd.ExecuteNonQuery();
            }
我们可以看出,在using语句中,省去了“conn.Close()”“conn.Dispose”操作,即无需手动编程关闭链接和释放资源。

using 语句允许程序员指定使用资源的对象应当何时释放资源。为 using 语句提供的对象必须实现IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源可以有多个对象与 using 语句一起使用,但是必须在 using 语句内部声明这些对象。

可以在到达 using 语句的末尾时,或者在该语句结束之前引发了异常并且控制权离开语句块时,退出using 语句。

using语句的本质:

使用using语句实际上生成的IL代码中是一个try, finally代码块,在finally代码块里释放资源。

 

 

1.使用using 来对数据库进行操作,using是资源释放的一种缩写,用于实现了实现了IDisposable接口(释放对象资源的接口是IDisposable)

 

 private void button2_Click(object sender, RoutedEventArgs e)
        {
            //source 那边用点代表本机如果是其它机器你可以用ip地址,(本机也可以用127.0.0.1)
            using (SqlConnection conn = new SqlConnection(  
               "Data Source=127.0.0.1;Initial Catalog=OrderDB;User ID=sa;Password=123456789"))
            {
                conn.Open();//要先打开连接
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    //插入数据
                    cmd.CommandText = "insert into admin(name,password,rank) values(‘hello‘,‘123456‘,1)";
                    cmd.ExecuteNonQuery();
                }
                using (SqlCommand cmd = conn.CreateCommand()) 
                {
                    //参数的使用
                    cmd.CommandText = "select * from admin where [email protected]";
                    cmd.Parameters.Add(new SqlParameter("@rank", 2));
                    //因为SqlDataReader实现了IDisposable接口,释放对象资源的接口是IDisposable
                    using (SqlDataReader reader = cmd.ExecuteReader()) 
                    {   
                        //查询到结果放在数据库中没有放到客户端中,以后可以用DataSet处理
                        while (reader.Read())
                        {
                            string name = (string)reader.GetString(0);
                            MessageBox.Show(name);
                        }
                    }
                    
                }
          }
}       

 

 

添加配置文件 :

在Winform下要新增App.config文件,在Asp.net下要新增web.config文件。

1.打开配置文件添加相关代码后如下即可:

技术分享
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="myconn" connectionString="Data Source=.;Initial Catalog=Northwind;
         Persist Security Info=True;User ID=sa;Password=110"/>
  </connectionStrings>
</configuration>
技术分享

2.添加using System.Configuration;并在项目上右键“添加引用”->.Net组件中"Using Configuration"

如果不在组件中添加引用的话,后续的代码编译不过。

 

 

3.如下为读取数据的相关代码

 

技术分享
 private void button1_Click(object sender, EventArgs e)
        {
            string connstr = ConfigurationManager.ConnectionStrings["myconn"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                SqlCommand comm = new SqlCommand("select FirstName from Employees", conn);
                conn.Open();
                SqlDataReader sdr = comm.ExecuteReader();
                
                while (sdr.Read())
                {
                    listBox1.Items.Add(sdr[0].ToString());
                }
            }
        }
技术分享

 

 

 

 

 

 

 

以上是关于详细说一下C#中using自动释放资源的用法的主要内容,如果未能解决你的问题,请参考以下文章

C# 中使用using的三种方法

C# using()的本质

c# using的疑问

C#中的using关键字用法总结

C#中using(...){...}的意思

c#啥时候有必要用using(代码段)?