9.C#基础之命名空间(完成)

     C#程序是利用命名空间组织起来的!命名空间既能做程序的"内部"组织系统,也能做"外部"组织系统。而using指令就是让命名空间使用起来更便捷。

  9.1编译单元    

     编译单元定义了源文件的总体结构,组成方式是:先是零个或多个using指令,后跟零个或多个全局属性,然后是零个或多个命名空间成员声明。

     我们第二章写过C#程序由一个或多个源文件组成,而源文件形式上被称为编译单元,是因为每个编译单元都用一个单独的源文件来保存,所以也可以说C#程序由一个或多个编译单元组成。编译C#程序时,所有这些编译单元一起进行处理,因此这些编译单元可以互相依赖,甚至以循环方式互相依赖。

     发编译单元中的using指令的作用范围包括该编译单元内的所有全局属性和命名空间成员声明,但不会影响其他编译单元;

     全局属性用于指定目标程序集和模块的属性,程序集和模块充当类型的物理容器,程序集又可以包含若干个在物理上分离的模块;

     命名空间成员声明用于为一个称为"全局命名空间"的单个声明空间提供成员。

  9.2命名空间声明

     命名空间声明的组成方式:关键字namespace,后跟一个命名空间名称和命名空间体,后面可以选择性的加一个分号:

     命名空间声明可以作为顶级声明出现在编译单元中,也可以作为成员声明出现在另一个命名空间声明内。作为顶级声明时,该命名空间成为全局命名空间的一个成员;作为成员声明时,内部的命名空间就成为包含着它的外部命名空间的一个成员。无论什么情况,命名空间的名称在它所属的命名空间内必须是唯一的。

     命名空间隐式为public,且在命名空间的声明中不能出现任何访问修饰符。

     在命名空间中,可以用using指令来导入其他命名空间和类型的名称,这样就能直接地引用它们,而不是用繁琐的限定名来引用。using中可选的命名空间成员声明用于为所在的命名空间提供成员。

     命名空间声明中的限定标识符可以是单个标识符,也可以是由"."标记分隔的标识符序列。后者允许程序直接定义一个嵌套命名空间。比如:

  9.2using指令

     开头说过,using指令方便了对在其他命名空间中定义的命名空间和类型的使用。using指令仅影响命名空间或类型名称和简单名称的名称解释过程。与声明不同,using指令不会将新成员添加到它们所在的编译单元或命名空间相对应的声明空间中。

     using指令的范围扩展到直接包含它的编译单元或命名空间中的所有命名空间成员声明,且using指令的范围不包括与它对等的using指令,因此using互不影响,且按什么顺序编写也没关系。

   9.3.1 using别名指令

     using别名指令:用于为一个命名空间或类型指定一个别名(标识符),别名的范围在直接包含指令的编译单元或命名空间中有效。

     在包含using别名指令的编译单元或命名空间中的成员声明中,由using别名指令引入的标识符可以用于引用给定的命名空间或类型。比如:

     上面N3中声明A是命名空间N1.N2中类A的别名,所以N3中的类B是类A派生的。

        注:1.using别名指令中的标识符在直接包含该using别名指令的编译单元或命名空间的声明空间内必须是唯一的,也就是如果上面N3中有个名为A的其他成员,你在把别名设成A,就会发生编译时错误。

            2.别名只能用在特定范围,不会产生任何新成员添加到相应声明空间。换一个意思就是using别名指令不可传递。比如把上面N3中的using A=N1.N2;  Class B:A.R就会报错。

            3.和常规成员一样,using别名指令引入的别名在嵌套范围中可以被具有相似名称所隐藏。比如下面,别名R被class R隐藏了,所以会报错。

   9.3.2using命名空间指令

     using命名空间指令:将一个命名空间中所包含的类型导入到直接封闭该指令的编译单元或命名空间中,从而引用时不必加上它们的限定名。

     比如:

     上面这个例子,在N3中声明了N1.N2,所以类B是A派生的。但同样,using命名空间指令不导入嵌套的命名空间。比如:

     Class B后面的继承就发生错误,因为using导入了N1中的类型,不导入嵌套N1中的命名空间。

     using命名空间指令也存在被类似名称的成员隐藏的可能。

  9.4命名空间成员

     命名空间成员声明是一个命名空间声明,或是一个类型声明。

     编译单元或命名空间体可以包含命名空间成员声明,而此类声明则为包含它们的编译单元或命名空间体相关的声明空间提供新成员。

  9.5类型声明

     类型声明是类声明、结构声明、接口声明、枚举声明、委托声明。

     类型声明可以作为顶级声明出现在编译单元,也可以作为成员声明出现在命名空间、类或结构内部。当类型T作为顶级声明时,新声明的类型的完全限定名正好是T;作为成员声明时,新声明的类型的完全限定名是N.T(N表示包含它的命名空间、类或结构的完全限定名)。

          注:在类或结构内声明的类型称为嵌套类型

     在类型声明中允许使用哪些访问修饰符及是哪种默认访问属性,取决于该声明发生的上下文:

posted @ 2018-12-10 13:29  狂风过境的风  阅读(337)  评论(0编辑  收藏  举报