C#中using关键字有三种使用场景:
- 引入命名空间
- 给命名空间取别名
- 释放托管资源
引入命名空间
using MyNameSpace;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication18
{
class Program
{
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection();
}
}
}
namespace MyNameSpace
{
public class SqlConnection
{
}
}
上述代码中,第一句 using MyNameSpace; 就是引入命名空间。
给命名空间取别名
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
namespace ConsoleApplication18
{
using mns = MyNameSpace.xxx.xx;
class Program
{
static void Main(string[] args)
{
mns.SqlConnection conn = new mns.SqlConnection();
}
}
}
namespace MyNameSpace.xxx.xx
{
public class SqlConnection
{
public SqlConnection()
{
Console.WriteLine("This is MyNameSpace.SqlConnection.");
}
}
}
经过改造,我又导入一个新的命名空间 using System.Data.SqlClient ,刚好这个命名空间下也有一个叫SqlConnection类的定义,当两个命名空间同时被引入进来之后,编译器并不知道是创建哪个命名空间下得实例,所以编译器不能通过编译。
我们还把先前的MyNameSpace改长了点。这样如果使用命名空间+类名的方式来创建类的实例将是件很繁琐的事情,而且代码的可读性也会下降。
这时我们就可以使用 using语句来为命名空间取个别名
释放托管资源
众所周知,C#是由CLR托管执行的,它是类型安全的,CLR提供的类型检查、垃圾回收、异常处理、跨语言跨平台、内存管理等等众多的功能。
托管代码由CLR管理或执行,不能直接写类存,是类型安全的,由GC释放资源。
C#代码首先 - 编译为托管代码(IL代码) - 在由CLR托管执行
非托管代码:由系统管理和执行,无需中间编译,可以直接写内存,由程序员进行内存的分配和释放。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
namespace ConsoleApplication18
{
using mns = MyNameSpace.xxx.xx;
class Program
{
static void Main(string[] args)
{
mns.SqlConnection conn = new mns.SqlConnection();
using (SqlConnection con=new SqlConnection())
{
}
}
}
}
namespace MyNameSpace.xxx.xx
{
public class SqlConnection
{
public SqlConnection()
{
Console.WriteLine("This is MyNameSpace.SqlConnection.");
}
}
}
我们再次改造代码,看到使用了 using(SqlConnection con=new SqlConnection())
这就是using的第三个使用场景,释放托管资源。using括号中的类必须要继承System.IDisposable接口并实现Dispose方法。当using块执行完毕之后CLR会自动调用Dispose方法来释放资源。
其实using块就是一个try-finally,我们可以通过IL反汇编来查看