17xie首页 > 综合频道 > 科学技术 > C#本质论 > 4.3 using指令

4.3 using指令

[更新时间]2008-08-26 12:34:07 [字数]5699

4.3 using指令

可以将命名空间的类型导入封闭作用域(enclosing scope)中。所以,程序员并非一定要对类型进行完全限定,而可以使用using指令(通常在文件的顶部)。例如在代码清单4-6中,Console没有附加System前缀。而是程序在代码清单的顶部使用了一个using System;语句。

代码清单4-6 using指令的例子

    // The using directive imports all types from the

    // specified namespace into the enclosing scope-in

    // this case, the entire file.

    using System;                             

    class HelloWorld

    {

      static void Main()

      {

          // No need to qualify Console with System

          // because of the using directive above.

      Console.WriteLine("Hello, my name is Inigo Montoya");       

      }

}

代码清单4-6的结果如输出4-2所示。

输出4-2

Hello, my name is Inigo Montoya

假如方法在一个更具体的命名空间中,那么像using System这样的using指令不允许省略System。例如,假定代码要访问System.Text中的一个类型,那么必须包含一个附加的using System.Text指令,或者对类型进行完全限定。using指令不会导入任何嵌套的命名空间。嵌套的命名空间(由命名空间中的句点符号来标识)需要显式地导入。

语言对比:import指令中的Java通配符

Java允许使用通配符来导入命名空间,例如:

import javax.swing.*;

与之相比,C#不允许在using指令中使用通配符,每个命名空间都必须显式地导入。

语言对比:Visual Basic .NET——项目范围的Imports指令

和C#不同,Visual Basic .NET允许为整个项目(而非只是单个文件)使用与using指令等价的Imports指令。换言之,Visual Basic .NET提供了using指令的一个命令行版本,它能对整个项目的所有文件起作用。

通常,假如你的程序要用到一个命名空间中的许多类型,就应该考虑为该命名空间使用using指令,以避免对该命名空间中的所有类型都进行完全限定。正是这个原因,几乎所有文件都在顶部添加了一个using System指令。在本书剩余的部分,代码清单中经常故意地省略using System指令。但是,其他命名空间指令都会显式地包含。

使用using System指令后,一个有趣的结果是,可以使用不同的大小写形式来表示字符串数据类型:String或者string。前一个版本依赖于using System指令,后一个版本使用string关键字。两者在C#中都合法地引用了System.String数据类型,最终生成的CIL代码毫无区别。

高级主题:嵌套的using指令

不仅可以在文件的顶部进行using声明,还可以在namespace声明的顶部包含它们。例如,假定声明了一个新的命名空间Awl.Michaelis.EssentialCSharp,就可以在这个声明的顶部添加using指令,如代码清单4-7所示。

代码清单4-7 在一个命名空间声明中指定using指令

namespace Awl.Michaelis.EssentialCSharp

{

  using System;                                                  

  class HelloWorld

  {

    static void Main()

    {

        // No need to qualify Console with System

        // because of the using directive above.

       Console.WriteLine("Hello, my name is Inigo Montoya");      

    }

  }

}

输出4-3展示了结果。

输出4-3

Hello, my name is Inigo Montoya

 
在文件的顶部放置using指令和在namespace声明的顶部放置using指令的区别在于,后者的using指令只在你声明的那个命名空间内有效。假如在Awl.Michaelis.EssentialCSharp命名空间的外部又声明了一个新的命名空间,新的命名空间不会受到using System指令的影响。不过,很少会这样写代码,尤其是根据约定,每个文件只应该有一个类型声明。

使用别名

还可以利用using指令为命名空间或类型取一个别名。别名(alias)是在using指令所在的那个范围内可以使用的一个替代名称。之所以要使用别名,两个最常见的原因是:(1)消除同名的两个类型的歧义;(2)缩写一个长名称。在代码清单4-8中,CountDownTimer别名引用了System.Timers.Timer类型。仅仅添加一个using System.Timers指令,不足以完全限定Timer类型,原因是System. Threading也包含一个名为Timer的类型,所以在代码中直接使用Timer就会造成歧义。

代码清单4-8 声明一个类型别名

    using System;

    using System.Threading;                                

    using CountDownTimer = System.Timers.Timer;            

    class HelloWorld

    {

      static void Main()

      {

      CountDownTimer timer;                             

          // ...

       }

    }

代码清单4-8将一个全新的名称CountDownTimer作为别名使用。然而,你可以将别名指定为Timer,如代码清单4-9所示。

代码清单4-9 声明同名的一个类型别名

using System;

using System.Threading;

  // Declare alias Timer to refer to System.Timers.Timer to                      

  // avoid code ambiguity with System.Threading.Timer                            

  using Timer = System.Timers.Timer;                                   

class HelloWorld

{

  static void Main()

  {

      Timer timer;                                                      

     // ...

  }

}

由于Timer现在是一个别名,所以"Timer"不是一个歧义引用。除此之外,如果要引用System. Threading.Timer类型,就必须完全限定这个类型或者定义一个不同的别名。

举报不良信息 本页地址:http://zonghe.17xie.com/book/10794888/294229.html
   

← →键盘左右键前后翻页,回车[enter]返回本书首页
  • 支持本书:
Copyright©2007 17xie.com 互动写作和阅读平台 京ICP备08002671号