说明:温故即温习之前已经掌握但比较模糊的知识;取自于“温故而知新”
using
在C#中有三种使用场景,如下:
- 引用命名空间;
- 为命名空间取一个易于使用的别名;
- 帮助管理非托管资源。
引用命名空间
使用场景:当需要使用某一个命名空间中的类型时,通过using
可以免去引用该类型时,输入完全限定名的痛苦(因为命名空间大多比较长)。
当不引入命名空间的时候,需要这样引用命名空间中的类型
namespace UsingDemo {
class Program {
static void Main(string[] args) {
System.Collections.Generic.List<string> tmp = new System.Collections.Generic.List<string>();
}
}
}
当引用了命名空间的时候,仅需要按下面引用即可
using System.Collections.Generic;
namespace UsingDemo {
class Program {
static void Main(string[] args) {
List<string> tmp = new List<string>();
}
}
}
引用命名空间时需注意命名空间引用位置:
- 引用位置可在文件顶部或当前命名空间的顶部;
- 不可在类的内部、函数内部、属性内部引用,否则会编译错误。
正确示例如下:
// 在文件顶部引入
using System.Collections.Generic;
namespace UsingDemo {
class Program {
static void Main(string[] args) {
List<string> tmp = new List<string>();
}
}
}
namespace UsingDemo {
// 当前命名空间的顶部引入
using System.Collections.Generic;
class Program {
static void Main(string[] args) {
List<string> tmp = new List<string>();
}
}
}
错误示例如下(会编译错误,即代码下面会有很多红色的波浪线):
命名空间别名
使用场景:引入的多个命名空间中的类型产生冲突,并且冲突的命名空间都是程序需要的。
比如以下代码,编译器会告诉我们,有多个可以匹配的类型(即有歧义):
则可以通过别名的方式来解决此问题(不用为每一个冲突的命名空间取别名):
注意第二行中代码
using WM = System.Windows.Media;
,此处就是将WM
定义为命名空间System.Windows.Media;
的别名,因此后续才可以通过【别名.类型】的方式引用,如下:
WM.Color color2 = new WM.Color();
帮助管理非托管资源
使用场景:
- 当程序需要使用非托管资源,如文件操作、网络操作、数据库操作等,使用
using
对其管理会更方便、安全; - 需要在GC的时候强制回收的对象(如过多的大图,则可实现
IDisposable
接口,进行强制管理 ); - 程序中,需要非托管资源的生命周期需要与类相同时,则可以通过为该类实现
IDisposable
接口,来更加方便的管理非托管资源。
示例代码如下:
// 示例一
namespace UsingDemo {
class Program {
static void Main(string[] args) {
using (FileStream fs = new FileStream("C://using_demo.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)) {
byte[] data = Encoding.UTF8.GetBytes("Hello Using!");
fs.Write(data, 0, data.Length);
}
}
}
}
// 示例二: 非托管资源的生命周期需要与类相同
namespace UsingDemo {
class Demo : IDisposable {
private FileStream fileStream;
public void Dispose() {
// 此处手动释放资源
fileStream?.Dispose();
}
}
class Program {
static void Main(string[] args) {
using (Demo demo = new Demo()) {
}
}
}
}
注意事项:
using
只能用于实现了IDisposable
接口的类型,不能为未实现IDisposable
接口的类型使用using
语句,否则会出现编译错误;
实现了IDisposable接口之后:
- 如果有多个非托管资源需要管理,则使用嵌套的
using
语句将会更加合适,但内层using
最好不要有异常产生,否则内层using
块引发异常时,则有可能无法正确释放外层using
块的资源;
鉴于此,不建议使用嵌套的using
语句;
using
语句支持初始化多个变量,但前提是这些变量的类型必须相同。