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指令为命名空间或类型取一个别名。别名(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类型,就必须完全限定这个类型或者定义一个不同的别名。
















