using关键字有两个主要用途:

  • 作为指令,为命名空间创建别名或导入其他命名空间中的类型。
  • 作为语句,定义一个范围,在此范围的末尾将释放对象。

using指令

using指令有两个用途:

  • 导入其他命名空间中的类型:
  • using System.Text;

  • 为命名空间或类型创建别名:
  • using Project = PC.MyCompany.Project;

using指令的特点:

  • using指令的作用范围限制为包含它的文件,在其他文件中的using指令,对现有文件无效。
  • using别名,用于方便讲标识符限定到命名空间或类型。using别名指令的右侧必须是一个完全限定类型。且与前面的using指令无关。
  • using指令,便于在命名空间中使用而类型,而不必指定命名空间。
  • using指令不提供对嵌套在指定命名空间中的任何命名空间的访问。

示例1

下面的示例演示如何为命名空间定义和使用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>,但可以为List<int>创建别名。

示例2

下面演示如何为类定义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语句

便于正确使用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块中。

Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
// use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight();

随机推荐

  1. The Layout Process on Mac OSX and iOS

    First we will recap the steps it takes to bring views on screen with Auto Layout enabled. When you’r ...

  2. RSA非对称加密

    先上RSA加密算法的一些简介(截图自轩辕老师的课件): 嗯--RSA就是这么一回事,于是有了如下题目: 1.In an RSA system, the public key of a given us ...

  3. [SQL Basics] Indexes

    An index is used to speed up searching in the database. By default, when you create this table, your ...

  4. 加入Tomcat插件到ECLIPSE中的方法

    1.下载Tomcat插件com.sysdeo.eclipse.tomcat_3.3.1.jar 下载路径http://www.eclipsetotale.com/ 2.安装插件 把下载的插件放到E:\ ...

  5. inline-block

    在CSS中,块级对象元素会单独占一行显示,多个block元素会各自新起一行,并且可以设置width,height属性:而内联对象元素前后不会产生换行,一系列inline元素都在一行内显示,直到该行排满 ...

  6. linux 远程管理

    启动linuxssh 服务: /etc/init.d/ssh 启动网络服务: service network restart linux远程登录配置过程: 首先在ubuntu下安装openssh-se ...

  7. day12_API第二天

    1.Scanner注意问题 1.Scanner中方法                   next() -- 查找并返回来自此扫描器的下一个完整标记.           nextLine() -- ...

  8. 使用STL离散化

    把原来的数组a复制一份拷贝b 用sort先把数组a排序 用unique消除a里面重复的元素 对于b中的每一个元素,用lower_bound找到它在a中的位置,也就是离散化之后的编号. 没了. #inc ...

  9. java Scanner

    public static void main(String[] args) throws IOException { System.out.print("Enter a number:&q ...

  10. 037. asp.netWeb用户控件之五使用用户控件实现文件上传功能

    fileUpload.ascx代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile= ...