概述
C#中的using关键字是什么?
我们需要明确:using
是C#语言中的一个关键字。
所以在C#的编码过程中我们是不能直接使用using
这个字符串来作为变量名的。
什么地方使用using?
在C#的编码中using大致有两种使用场景:
using使用场景一
1.使用using关键字引入命名空间
首先在Visual Studio中创建一个名为UsingDemo的类库项目,IDE会自动为我们创建一个同名(UsingDemo)的解决方案,再在项目中新建一个类,取名Blog.cs,示例代码片段:
/*此处使用了using 关键字来引入System命名空间
*注意:System命名空间的.NET Framework库自带的命名空间
* 所以,只在项目中引用了System这个类库,就可以在这里直接使用using来引入
* 在新建C#项目类库项目时,IDE默认是引入了System类库的
*/
using System;
/*此处的UsingDemo就是自定义的命名空间
*我们可以在其他引用了UsingDemo这个项目的文件中使用using来引入UsingDemo这个命名空间
*/
namespace UsingDemo
{
/// <summary>
/// 声明一个名为Blog的类
/// </summary>
public class Blog
{
public int Id { get; set; }
public string Title { get; set; }
public string Post { get; set; }
public DateTime CreatedOn { get; set; }
}
}
在代码片段中,我们首先使用using关键字来引入System这个命名空间,在这里using就是起到引入指定命名空间的作用。
说明:示例中的namespace即声明了一个命名空间,上面的示例即声明了一个名为”UsingDemo”的命名空间,我们可以在其他引用了UsingDemo这个项目的文件中使用using来引入UsingDemo这个命名空间。
再在UsingDemo解决方案中新建一个名为:UsingDemo.Client的控制台应用程序项目。
在UsingDemo.Client的项目的”引用”中右键单击”添加引用”,在弹出的”引用管理器”中点击”解决方案”选项卡,勾选我们上面创建的”UsingDemo”项目。
这样,我们就在UsingDemo.Client控制台应用程序项目中成功引用了”UsingDemo”这个项目。
那么,我们就可以在UsingDemo.Client项目的cs文件中使用using关键字来引入”UsingDemo”这个命名空间,如下代码示例片段:
using System;
//使用using关键字来引入我们自定义的命名空间--UsingDemo
using UsingDemo;
namespace UsingDemo.Client
{
class Program
{
static void Main(string[] args)
{
//实例化一个Blog类
var blog = new Blog
{
Id = 1,
Title = "博客标题",
Post = "博客内容",
CreatedOn = DateTime.Now
};
Console.WriteLine("Title:{0}", blog.Title);
Console.WriteLine("-----------------------------------------");
Console.WriteLine("Post:{0}", blog.Post);
Console.WriteLine("-----------------------------------------");
Console.WriteLine("CreatedOn:{0}", blog.CreatedOn);
Console.WriteLine("-----------------------------------------");
Console.ReadKey();
}
}
}
运行结果如图:
好了,以上就是对using关键字引入命名空间的使用的示例说明。
using使用场景二
2.using语句块
using
语句块可以很好地为我们管理内存资源。
在C#和其他托管语言中,没有自动、决定性的析构方式,而是有一个垃圾收集器,它会在未来的某个时刻释放资源。它是非决定性的,因为我们不能确定这个过程在什么时候发生。
下面以连接数据库为例来说明使用using语句块的好处。
在数据库的操作上,我们需要先定义数据库的连接字符串,再打开连接进行相应的数据操作,使用完数据库连接后,我们还得把这个连接关闭掉。看一下不用using语句块的场景:
try
{
//定义数据库连接字符串
var strConn = "数据库连接字符串";
//定义并实例化一个连接类
var conn = new SqlConnection(strConn);
//打开数据库连接
conn.Open();
//相应的数据库操作和业务逻辑处理
//手动关闭数据库连接(注意:数据库连接使用之后一定记得关闭)
conn.Close();
}
catch (Exception e)
{
//处理异常
}
在以上代码片段中,我们必须手动去关闭数据库的连接以及手动使用try…catch语句块来处理异常。那么如果使用using语句块会如何呢?也是一样,看示例代码片段:
//定义数据库连接字符串
var strConn = "数据库连接字符串";
using (var conn = new SqlConnection(strConn))
{
//打开数据库连接
conn.Open();
//相应的数据库操作和业务逻辑处理
}
在这个示例中,无论块是如何退出的,using子句都会确保关闭数据库连接。
查看一下连接类的Dispose()方法的IL代码,它们都检查连接对象的当前状态,如果其状态为打开,就调用Close()方法。
浏览.NET程序 集的一个强大工具是Reflector(可以从/www.aisto.com/roeder/dotnet/上获得)。这个工具允许查看任何.NET方法 的IL代码,还可以把IL代码反编译为源代码,让我们轻松地确定给定的方法的作用。
另外,如果在using块中出现了异常,using子句就会确保在资源上调用IDisposable.Dispose方法,在本例中将确保总是关闭数据库连接。这样,与必须确保在异常子句中关闭连接相比,代码的可读性更高。
最后,如果编写一个封装资源的类,无论该资源是什么,都应实现IDisposable接口,关闭资源。这样,任何使用该类的代码都可以利用using()语句,以确保资源被释放。
C# 8中的using声明
在C# 8中,新增了using declaration语法,即:C#的变量被using
关键字修饰,类似如下:
using var reader = new StringReader(manyLines);
上以示例代码中的变量reader
即被关键字using
修饰。using
语句提供了一种方便的语法,可以确保正确使用IDisposable
对象。
简单来说,它是using
语句块的一种简写。如下有一种传统的using
语句块写法的代码片段:
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
using (var reader = new StringReader(manyLines))
{
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
}
使用using
声明的写法如下:
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
using var reader = new StringReader(manyLines);
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
using
声明的写法中,被using
修饰的变量会在此变量的作用域结束时自动释放资源。
注意:所有能被using
修饰的变量的类型必须实现IDisposable
或者IAsyncDisposable
接口。
比如,这里被using
修饰的reader
变量的类型为StringReader
,StringReader
是实现了IDisposable
接口的,如下图:
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册