using
指令(C#
参考)
Visual Studio 2010
·
using
指令有两个用途:
·
允许在命名空间中使用类型,这样,您就不必在该命名空间中限定某个类型的使用:
·
为命名空间或类型创建别名。
这称为“using
别名指令”。
using Project = PC.MyCompany.Project;
using
关键字还用来创建 using
语句,此类语句有助于确保正确处理
IDisposable
对象(如文件和字体)。
有关更多信息,请参见
using
语句。
using
指令的范围限制为包含它的文件。
创建
using
别名,以便更易于将标识符限定到命名空间或类型。
using
别名指令的右侧必须始终是一个完全限定类型,而与前面的 using
指令无关。
创建
using
指令,以便在命名空间中使用类型而不必指定命名空间。
using
指令不为您提供对嵌套在指定命名空间中的任何命名空间的访问。
命名空间分为两类:用户定义的命名空间和系统定义的命名空间。
用户定义的命名空间是在代码中定义的命名空间。
有关系统定义的命名空间的列表,请参见
.NET Framework
类库。
有关引用其他程序集中的方法的示例,请参见创建和使用
C# DLL。
说明
下面的示例显示了如何为命名空间定义和使用
using
别名:
代码
namespace PC
{
// Define an alias for the nested namespace.
using Project = PC.MyCompany.Project;
class A
{
void M()
{
// Use the alias
Project.MyClass mc = new Project.MyClass();
}
}
namespace MyCompany
{
namespace Project
{
public
class MyClass { }
}
}
}
注释
using
别名指令的右侧不能有开放式泛型类型。
例如,不能为 List<T>
创建 using
别名,但可以为 List<int>
创建。
说明
下面的示例显示了如何为类定义
using
指令和
using
别名:
代码
using System;
// Using alias directive for a class.
using AliasToMyClass = NameSpace1.MyClass;
// Using alias directive for a generic class.
using UsingAlias = NameSpace2.MyClass<int>;
namespace NameSpace1
{
public
class MyClass
{
public
override
string ToString()
{
return
"You are in NameSpace1.MyClass.";
}
}
}
namespace NameSpace2
{
class MyClass<T>
{
public
override
string ToString()
{
return
"You are in NameSpace2.MyClass.";
}
}
}
namespace NameSpace3
{
// Using directive:
using NameSpace1;
// Using directive:
using NameSpace2;
class MainClass
{
static
void Main()
{
AliasToMyClass instance1 = new AliasToMyClass();
Console.WriteLine(instance1);
UsingAlias instance2 = new UsingAlias();
Console.WriteLine(instance2);
}
}
}
// Output:
//
You are in NameSpace1.MyClass.
//
You are in NameSpace2.MyClass.
using
语句(C#
参考)
Visual Studio 2010
提供能确保正确使用
IDisposable
对象的方便语法。
下面的示例演示如何使用 using
语句。
using (Font font1 =
new Font("Arial",
10.0f))
{
byte charset = font1.GdiCharSet;
}
File
和
Font
是访问非托管资源(本例中为文件句柄和设备上下文)的托管类型的示例。
有许多其他类别的非托管资源和封装这些资源的类库类型。
所有这些类型都必须实现
IDisposable
接口。
按照规则,当使用
IDisposable
对象时,应在
using
语句中声明和实例化此对象。
using
语句按照正确的方式调用对象上的
Dispose
方法,并(在您按照前面所示方式使用它时)会导致在调用
Dispose
时对象自身处于范围之外。
在
using
块中,对象是只读的并且无法进行修改或重新分配。
using
语句确保调用
Dispose,即使在调用对象上的方法时发生异常也是如此。
通过将对象放入 try
块中,并在调用 finally
块中的
Dispose,可以获得相同的结果;实际上,这就是编译器转换
using
语句的方式。
前面的代码示例在编译时将扩展到以下代码(请注意,使用额外的大括号为对象创建有限范围):
{
Font font1 = new Font("Arial",
10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 !=
null)
((IDisposable)font1).Dispose();
}
}
如下面的示例所示,可以在
using
语句中声明一个类型的多个实例。
using (Font font3 =
new Font("Arial",
10.0f),
font4 = new Font("Arial",
10.0f))
{
// Use font3 and font4.
}
可以实例化资源对象,然后将变量传递给
using
语句,但这不是最佳做法。
在这种情况下,该对象将在控制权离开
using
块之后保持在范围内,即使它可能将不再具有对其非托管资源的访问权也是如此。
换句话说,再也不能完全初始化该对象。
如果尝试在
using
块外部使用该对象,则可能导致引发异常。
由于这个原因,通常最好是在
using
语句中实例化该对象并将其范围限制在
using
块中。