《.NET程序员面试秘笈》----面试题16 请简述 .NET的命名空间

    xiaoxiao2024-04-08  117

    本节书摘来自异步社区《.NET程序员面试秘笈》一书中的第1章,面试题16,作者: 张云翯, 更多章节内容可以访问云栖社区“异步社区”公众号查看。

    面试题16 请简述 .NET的命名空间

    .NET程序员面试秘笈【考点】.NET的命名空间的基本理解,自定义命名空间的知识,在程序中使用命名空间的各种技巧。

    【出现频率】

    【解答】

    使用命名空间的方法可以反映程序中的逻辑关系,并且可以有效避免类名冲突。命名空间就是各种类或其他类型名称的逻辑组织方式,而不代表物理组织方式。例如以下代码:

    System.Windows.Forms.MessageBox.Show("文本内容");在执行以上代码时,将跳出一个带有“确定”按钮的对话框,并停止程序的运行。其中,System.Windows.Forms是命名空间,调用了MessageBox类的Show静态方法。这种将命名空间和类名称用点符号相连使用时,类名被称为全饰类名,用同样的方法可以调用.NET基类库的所有类型。不过,这种方法比较麻烦,当程序中多处使用相同命名空间时会明显增加代码量。所以常常在程序代码页顶部使用using关键字引入命名空间,相同的命名空间可被一次性引入,这样将大大减少重复劳动。在ch01目录下新建一个文件,名称为Namespace.cs,在其Namespace.cs中编写代码如程序1.18所示。

    程序1.18 命名空间示例:Namespace.cs

      using System;   using System.Windows.Forms;   class Namespace   {     static void Main()     {       Console.WriteLine("程序开始运行。");       MessageBox.Show("Hello!");       MessageBox.Show("你好,欢迎学习.NET!");       MessageBox.Show("下次再见!");       Console.WriteLine("程序运行结束。");     }   }

    在命令行下编译Namespace.cs后,执行Namespace程序,其效果如图1.27所示。

    原来,编译过程中,遇到如MessageBox的类型名称时,C#编译器将在using引入的命名空间中寻找该类型。如果C# 编译器找到了就把MessageBox类标识为全饰名称,即在前面加上命名空间,并用点符号分隔。反之,C# 编译器将报错。在顶部用using引入System.Windows.Forms命名空间后,可以直接使用MessageBox的类名并调用方法,Console类也是同样的原理(对应System命名空间)。

    不仅可以通过访问命名空间调用基类库提供的类型,编程者也可以自己组织命名空间,以方便多个类型的访问。用namespace关键字可自定义命名空间,并使用大括号将类型包含,namespace前面不需要加访问修饰符。因为命名空间不是文件物理的组织分类,所以一个程序集可以有多个命名空间甚至多层命名空间,多个程序集也可以使用同一个命名空间。

    本例定义两个类,分别存储于两个文件中,但这两个类定义相同的命名空间,其中一个类的字段存储了用户名信息,另一个类创建时将输出信息。然后创建第三个文件作为主程序,用using引入自定义命名空间,即可实现直接访问两个自定义类。在ch01目录下新建3个文件,分别名称为Username.cs、Mymsg.cs和Login.cs,在Username.cs中编写代码如程序1.19所示。

    程序1.19 用户名信息类:Username.cs

      using System;   //自定义LoginSystem命名空间   namespace LoginSystem   {     public class Username     {       //创建字符串类型的字段name       public string name = "wangxiaoming";     }   }

    在Mymsg.cs中编写代码如程序1.20所示。

    程序1.20 信息输出类:Mymsg.cs

      using System;   //自定义LoginSystem命名空间   namespace LoginSystem   {     public class Mymsg     {       public Mymsg()       {         //构造函数中输出信息         Console.WriteLine("我的信息:我身高180公分,喜爱篮球。");       }     }   }

    在Login.cs中编写代码如程序1.21所示。

    程序1.21 主程序类:Login.cs

      using System;   //引入LoginSystem命名空间   using LoginSystem;   class Login   {     static void Main()     {       Console.WriteLine("请输入正确的用户名(wangxiaoming):");       //接收用户输入,并赋值给input字符串变量       string input = Console.ReadLine();       //创建Username类型的实例a       Username a = new Username();       //判断用户输入值和a对象的name字段值是否相等       if (input == a.name)       {         //输出成功信息         Console.WriteLine("【{0}】,你已经登录成功。", a.name);         //创建Mymsg类的实例b         Mymsg b = new Mymsg();       }       else       {         //如果用户输入值和用户名不匹配,则输出失败信息         Console.WriteLine("登录失败。");       }     }   }

    本节举例说明了.NET已有命名空间和自定义命名空间,在运行第二个示例时,须首先将Username.cs和Mymsg.cs编译为dll程序集,然后编译Login.cs时引用这两个dll程序集。用csc编译器完成如图1.28所示。

    编译完成后,直接执行Login.exe程序,并输入正确的用户名信息如图1.29所示。

    本例的Login.cs代码中,通过引入自定义的LoginSystem命名空间,直接在主程序中访问了Username类和Mymsg类。进一步分析自定义命名空间,可以在同一个程序集中定义多个命名空间,并且其间可以嵌套,如以下代码所示:

    namespace A {   namespace B   {     class ClassNameOne { }   }   namespace C   {     class ClassNameTwo { }   } } namespace D.E {   class ClassNameThree { } }

    以上代码中,命名空间A包含了命名空间B和命名空间C,而命名空间D包含了命名空间E,只是用点符号简写了嵌套的格式。从本质上来看,命名空间只是有组织地编写长类型名的方式,通过点符号表明类型名称的含义及关联性。一般情况下提倡使用using在程序顶部导入将要使用的命名空间,但是当不同命名空间中有相同的类名时,则不能使用这种方法,应该使用全饰类名代替。为了避免全饰类名过长导致程序编写混乱,可以使用using定义命名空间的别名,如以下代码所示:

    namespace A {   namespace B   {     namespace C     {       class ClassName { }     }   } } //指定别名 using d = A.B.C; namespace D.E { class ClassNameThree {  //命名空间由A.B.C缩短为d d.ClassName obj =new ABC.ClassName(); } }

    【分析】

    .NET Framework由公共语言运行时(CLR)和基类库(BCL)组成,前者提供运行库环境,而后者则提供丰富的类库,适用于全部.NET编程语言调用。基类库不仅封装了各种类型,而且还支持很多服务。基类库在物理上表现为多个共享程序集,其中最重要的程序集是mscorlib.dll,这些程序集中包含了大量核心数据类型以及常见的编程任务。共享程序集安装于.NET特别指定的目录中,Windows操作系统中一般为%windir%assembly目录,如图1.30所示。

    这个目录也被称为全局程序集缓存(GAC),用户自己创建的共享程序集也必须安装于此目录,才可以在系统级别得到共享。丰富的基类库被存于这些程序集中,.NET编程语言可以通过命名空间使用这些类库,命名空间是程序集内相关类型的分组。如图1.30所示的程序集,一个程序集也可以包含多个命名空间,如mscorlib.dll包含了很多命名空间,并且每个命名空间可以包含多种类型。命名空间实际上是类名的扩展,如常用的命名空间System。在程序需要命令行输出时需使用System命名空间中Console类的WriteLine静态方法,编写代码如下:

    System.Console.WriteLine("输出内容");可见,需要使用Console类必须先引入其所属命名空间,并用点符号分隔。不仅仅调用基类库需要访问命名空间,编程者也可以定义自己的命名空间。

    说明:

    命名空间只是.NET组织各种相关类型的逻辑形式,方便编程者的理解。本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)