命名空间

合集下载

由浅到深理解ROS(3)-命名空间

由浅到深理解ROS(3)-命名空间

由浅到深理解ROS(3)-命名空间全局命名空间:/rosout前⾯的反斜杠“/”表明该节点名称属于全局命名空间。

之所以叫做全局名称因为它们在任何地⽅(包括代码、命令⾏⼯具、图形界⾯⼯具等的任何地⽅)都可以使⽤。

⽆论这些名称⽤作众多命令⾏⼯具的参数还是⽤在节点内部,它们都有明确的含义。

这些名称从来不会产⽣⼆义性,也⽆需额外的上下⽂信息来决定名称指的哪个资源。

如/turtle1/cmd_vel 由斜杠分开的⼀系列命名空间(namespace),每个斜杠代表⼀级命名空间。

命名空间⽤于将相关的计算图源(节点、话题、服务和参数统称为计算图源,⽽每个计算图源由⼀个叫计算图源名称(graph resource name)的短字符串识)归类在⼀起。

为了指明⼀个计算图源,需要完整列出其所属的命名空间,尤其是有时候命名空间层次⽐较多,这可能会让你抓狂。

这时,⼀个主要替代⽅案是让ROS为计算图源提供⼀个默认的命名空间,具有此特征的名称叫做相对计算图源名称(ralative graph resource name),或简称为相对名称(relative name)。

相对名称:相对名称的典型特征是它缺少全局名称带有的前斜杠“/”。

例如:cmd_vel 及 count_and_log/set_logger_level理解相对名称的关键是,如果不知道ROS 解析某个计算图源时所使⽤的默认命名空间,相对名称并不能和特定计算图源匹配。

解析相对名称:将相对名称转化为全局名称的过程相当简单。

ROS将当前默认的命名空间的名称加在相对名称的前⾯,从⽽将相对名解析为全局名称。

⽐如,如果我们在默认命名空间为/turtle1 的地⽅使⽤相对名称cmd_vel,那么ROS 通过组合⽅法得 /turtle1 + cmd_vel ⇒ /turtle1/cmd_vel相对名称也可以以⼀系列的命名空间开始,这些命名空间被看作是默认命名空间中的嵌套空间。

举个例⼦,如果我们在默认命名空间为/a/b/c/d/e/f 的地⽅使⽤相对空间g/h/i/j/k,ROS 将会将其进⾏组合为全局命名空间/a/b/c/d/e/f /g/h/i/j/k/l 得到的全局名称就可以⽤于确定⼀个特定的计算图源,就像前⾯介绍全局名称的使⽤时⼀样。

命名空间是什么如何理解其概念

命名空间是什么如何理解其概念

命名空间是什么如何理解其概念在编程的世界里,命名空间是一个非常重要的概念。

对于初学者来说,它可能会有些抽象和难以理解,但一旦掌握,它就能为我们的代码带来清晰的结构和更好的组织性。

想象一下,你正在一个大型的图书馆里寻找一本书。

如果所有的书都随意地堆放在一起,没有任何分类和标记,那么找到你想要的那本书将会是一项几乎不可能完成的任务。

同样的道理,在编程中,如果所有的变量、函数和类名都没有任何规则地混在一起,代码将会变得混乱不堪,难以维护和理解。

这就是命名空间发挥作用的地方。

简单来说,命名空间就是一种为代码中的标识符(如变量名、函数名、类名等)划定范围的方式。

它就像是一个容器,把相关的代码元素放在一起,并给它们一个独特的名称,以便于区分和管理。

比如说,我们有两个不同的模块,一个是处理数学计算的,另一个是处理文件操作的。

在数学计算模块中,我们可能有一个叫做`add` 的函数,用于两个数相加。

而在文件操作模块中,我们也可能有一个叫做`add` 的函数,但它的功能是向文件中添加内容。

如果没有命名空间,这两个同名的函数就会产生冲突,导致代码出错。

但是,通过使用命名空间,我们可以把这两个函数分别放在不同的命名空间中,比如`math` 和`file` ,这样就可以明确地区分它们,避免了混淆。

命名空间还可以帮助我们避免命名冲突,特别是在使用第三方库或者多个团队合作开发项目的时候。

不同的库或者团队可能会使用相同的名称来定义变量或函数,如果没有命名空间,这些冲突就很难解决。

但有了命名空间,我们可以在自己的代码中明确地指定使用哪个命名空间中的标识符,从而避免了不必要的麻烦。

为了更好地理解命名空间,让我们来看一个具体的编程语言的例子。

以 C++为例,我们可以使用`namespace` 关键字来定义一个命名空间。

```cppnamespace MathFunctions {int add(int a, int b) {return a + b;}}namespace FileOperations {void add(const std::string& content) {//向文件中添加内容的代码}}```在上面的代码中,我们定义了两个命名空间`MathFunctions` 和`FileOperations` ,分别包含了不同功能的`add` 函数。

C#命名空间(namespace)不可不知的那些事

C#命名空间(namespace)不可不知的那些事

C#命名空间(namespace)不可不知的那些事 命名空间本质上就是⼀个逻辑分组,就和我们⽂件夹分组是⼀致的,允许我们将相关的类型集合在⼀起。

命名空间是⼀个⽐较通⽤的概念,在很多语⾔⾥⾯都存在,只不过可能存在⼀些细微差别以及使⽤不同的名称。

⽐如Java就叫包(package)。

接下来,我们将从以下五个⽅⾯来讲解命名空间: 定义命名空间使⽤命名空间正确理解命名空间含义使⽤命名空间alias解决简单类名冲突使⽤extern alias解决Assembly中的完整类名冲突定义命名空间 命名空间的定义很简单,是以关键字namespace(命名空间的英⽂名)开始,后跟命名空间的名字和⼀对⼤括号。

⼤括号⾥的内容都属于这个命名空间。

格式如下: namespace namespace_name { } namespace_name是以点号(.)作为层级隔离的。

⽐如System.IO就可以认为System是第⼀层命名空间,IO是第⼆层命名空间。

由于命名空间其实就是⼀个逻辑分组,所以namespace这个关键字,我们可以理解为“如果不存在namespace_name这个命名空间,就创建⼀个。

如果存在,就使⽤这个命名空间”。

因此,我们是可以在多个地⽅定义同⼀个命名空间的,只要保证同⼀个命名空间中的内容不冲突即可,如下: namespace System.IO { class MemoryStream {} } namespace System.IO { class BufferedStream {} }使⽤命名空间 在程序中使⽤特定类型的时候,我们需要使⽤完整的限定名,⽐如System.IO.MemoryStream。

但是如果每次都这么写,除了增加了开发⼈员打字的成本,毫⽆益处。

因此我们可以使⽤using关键字来表明我们需要使⽤某个命名空间中的类型。

如下: //使⽤完整限定名 public static void Main() { System.Text.StringBuilder sb=new System.Text.StringBuilder(); } //使⽤using 关键字 using System.Text; public static void Main() { StringBuilder sb=new StringBuilder(); } using关键字,其实是告诉编译器可以尝试在这个特定的命名空间中查找类型。

嵌套命名空间定义-概述说明以及解释

嵌套命名空间定义-概述说明以及解释

嵌套命名空间定义-概述说明以及解释1.引言1.1 概述命名空间是编程语言中用来管理和组织代码的一种重要机制。

它可以避免命名冲突、提高代码的可读性和维护性。

嵌套命名空间是在传统命名空间的基础上增加了更多层次的嵌套结构,进一步提高了代码的灵活性和可扩展性。

本文将重点介绍嵌套命名空间的定义和使用方法,帮助读者更好地理解命名空间的概念和在实际项目中的应用。

通过深入探讨嵌套命名空间的优势和功能,读者可以更加灵活地组织自己的代码,提高代码的质量和可维护性。

1.2 文章结构本文分为引言、正文和结论三个部分。

在引言部分,将介绍文章的概述、结构和目的,帮助读者快速了解本文内容。

在正文部分,将详细讨论什么是命名空间、为什么需要嵌套命名空间以及如何定义嵌套命名空间,以便读者全面了解这一主题。

在结论部分,将对本文进行总结,讨论命名空间的应用和展望未来可能的发展方向,为读者提供深入思考和探讨的空间。

整体结构清晰,内容有序,帮助读者系统性地学习和理解嵌套命名空间定义的相关知识。

1.3 目的在本文中,我们的目的是探讨嵌套命名空间的定义及其在编程中的重要性。

通过深入了解命名空间的概念和嵌套命名空间的特点,我们可以更好地组织和管理代码,避免命名冲突,提高代码的可维护性和可扩展性。

我们将介绍如何正确地定义嵌套命名空间,以及在实际应用中如何利用嵌套命名空间提高代码的质量和可读性。

最终,我们希望读者能够通过本文深入了解嵌套命名空间的概念和用法,并在实际编程中灵活运用。

2.正文2.1 什么是命名空间命名空间是一种用来有效组织和管理代码的机制。

在编程中,我们经常会遇到不同的变量、函数和类之间可能会有重名的情况,这就会导致命名冲突,使得代码难以维护和阅读。

为了解决这个问题,引入了命名空间的概念。

命名空间可以将一组相关的变量、函数和类组织在一起,给它们分配一个独一无二的标识符,避免命名冲突,提升代码可读性和可维护性。

通过使用命名空间,我们可以在代码中更清晰地表达各个元素的关系,避免混淆和错误的发生。

Docker命名空间

Docker命名空间

Docker命名空间想学习更多Docker相关知识请看博主的个⼈博客地址:命名空间命名空间( namespace )是 Linux 内核的⼀个强⼤特性,为容器虚拟化的实现带来极⼤便利,利⽤这特性,每个容器都可以拥有⾃⼰单独的命名空间,运⾏在其中的应⽤都像是在独⽴的操作系统环境中⼀样命名间机制保证了容器之间彼此互不影响。

在操作系统中,包括内核、⽂件系统、⽹络、进程号( Process ID, PID )、⽤户号( UserID, UID 进程间通信( Inter Process Communication, IPC )等资源,所有的资源都是应⽤进程直接共享的要想实现虚拟化,除了要实现对内存、 CPU 、⽹络 IO 、硬盘 IO 、存储空间等的限制外,还要实现⽂件系统、⽹络、 PID UID IPC 等的相互隔离前者相对容易实现⼀些,后者则需要宿主主机系统的深⼊⽀持。

随着 Linux 系统对于命名空间功能的逐步完善,现在已经可以实现这些需求,让进程在彼此隔离的命名空间中运⾏虽然这些进程仍在共⽤同个内核和某些运⾏时环境(runtime ,例如⼀些系统命令和系统库),但是彼此是不可见的,并且认为⾃⼰是独占系统的Docker 容器每次启动时候,通过调⽤ func setNamespaces(daemon *Daemon, s *specs. Spec, c *container.Container) error ⽅法来完成对各个命名间的配置进程命名空间Linux 通过进程命名理进程号,对于同进程(同 task struct ),在不同的命名空间中,看到的进程号不相同个进程命名间有⼀套⾃⼰的进程号管理⽅法进程命名空间是⼀个⽗⼦关系的结构,⼦空间中的进程对于⽗间是可见的 fork 出的个进程,在⽗命名空间和⼦命名空间将分别对应不同的进程号例如,查看 Docker 服务主进程( dockerd )的进程号是 3393 ,它作为⽗进程启动了 docker containerd 进程,进程号为 3398,代码如下所⽰:$ ps - ef lgrep dockerroot 3393 1 0 Jan18 ? 00 43 02 /usr/bin/dockerd - H fd : // -H tcp://127 . 0 . 0 . 1 : 2375 -H unix:///var/run/docker.sockroot 3398 3393 0 Jan18 ? 00 : 34 : 31 docker containerd config /var/ru⼝/docker /conta nerd/conta nerd toml新建⼀个 Ubuntu 容器,执⾏ sleep 命令此时 docker containerd 进程作为⽗进程,会为每个容器启动⼀个 docker containerd shim 程,作为该容器内所有进程的根进程$ docker ru --name test d ubuntu :l6 . 04 sleep 9999$ ps -ef lgrep dockerroot 21535 3398 0 06 : 57 ? 00 : 00 : 00 docker-containerd-shim从宿主机上查看新建容器的进程的⽗进程,正是 docker-containerd shim 进程:$ ps -e f lgrep sleeproot 21569 21535 0 06 : 57 ? 00 : 00 : 00 sleep 9999⽽在容器内的进程空间中则把 docker containerd-shim 进程作为号根进程(类似宿主系统号根进程 idle), while 进程的进程号则变为(类似宿主系统中号初始化进程/sbin/init 容器内只能看到 docker containerd iim 程往下的⼦进程空间,⽽⽆法获知宿主机上的进程信息:$ docker exec -it 3a bash c ’ ps ef ’UID PID PPID C STIME TTY TI ME CMDroot 1 0 0 06 : 57 ? 00 : 00 : 00 sleep 9999IPC 命名空间容器中的进程交互还是采⽤了 Linux 常见的进程间交互⽅法( Interprocess Communication, IPC ),包括信号、消息队列和共内存等⽅式PID 命名间和 IPC 命名空间可以组合起来使⽤,同 IPC 命名间内的进程可以彼此可见,允许进⾏交互;不同间的进程则⽆法交互⽹络命名空间有了进程命名空间后,不同命名空间中的进 17-2 宿主机与容器内进程空间的关系程号可以相互隔离,但是⽹络端⼝还是共享本地系统的端⼝通过⽹络命名空间,可以现⽹络隔离。

命名空间namespace,以及重复定义的问题解析

命名空间namespace,以及重复定义的问题解析

命名空间namespace,以及重复定义的问题解析名字空间是⽤来划分冲突域的,把全局名字空间划分成⼏个⼩的名字空间。

全局函数,全局变量,以及类的名字是在同⼀个全局名字空间中,有时为了防⽌命名冲突,会把这些名字放到不同的名字空间中去。

⾸先我们看⼀下名字空间的定义:1//MyLib.h⽂件2namespace MyLib{3extern int i;//记住这是变量i的声明,不是i的定义4void fun();5 }//注意名字空间不像类的定义⼀样,右⼤括号后有分号//MyLib.cpp⽂件#include<iostream>#include"MyLib.h"//包含名字空间⽣命所在的⽂件using std::cout;//这是使⽤⽣命,不是使⽤指令using std::endl;int MyLib::i=10;//这是变量i的定义,并且初始化,当然也可以不⽤初始化直接写int MyLib::i;void MyLib::fun(){cout<<i<<endl;}上述代码有⼀个特别需要注意的地⽅就是,在MyLib.h⽂件中,如果使⽤声明,⽆论函数还是变量都必须使⽤声明,如果使⽤定义,⽆论函数还是变量都要使⽤定义。

在MyLib.h中,如果⼀个使⽤声明,另⼀个使⽤定义,那么再接⼝代码分离时会出现重复定义现象,例如//A.h⽂件namespace A{int i;//变量的定义,不是声明void fun();//函数的声明,不是定义,那么函数的定义可以放在A.cpp⽂件中,此时A.cpp⽂件需要#include“A.h“,}1//A.cpp2 #include"A.h"3void A::fun(){456 }//demo.cpp#include"A.h"int main(){return0;}上述三段代码会出现问题,因为A.cpp从新定义了变量i,变量i本来已经在A.h中已经定义,⽽A.cpp中⼜包含了A.h,相当于把A.h中的所有代码复制粘贴到A.cpp中。

C#命名空间详解

C#命名空间详解
System.Data.SqlTypes 提供用于SQL Sserver中本机数据类型的类。这些类提供其他数据类型更安全、更快速的替代物。使用此命名空间中的类有助于防止在可能 发生精度损失的情况中出现的类行转换错误。
System.Diagnostics 提供允许与系统进程、事件日志和性能计数器进行交互的类。此命名空间还提供可以调试应用程序和跟踪代码执行的类。
System.Drawing.Drawing2D 提供高级的二维和向量图形功能。此命名空间包括渐变笔、Matrix类(用于定义几何转换)和GraphicsPath类。
System.Drawing.Imaging 提供高级的GDI+图象处理功能
System.Drawing.Printing 提供与打印相关的服务。
建的,这些对象被配置为要求某些自定服务,如同步,事务,实时(JIT)激活、安全性。多个对象可以存留在以个上下文内。 System.Runtimg.Remoting.Lifetime
包含管理远程对象生存期的类。传统上,分布式垃圾回收功能使用引用计数和Ping来控制对象的生存期、这种机制在每一项服务只有较少的 客户端时可以正常工作,但是当每一项服务有几千个客户端时就不能正常工作了。远程处理生存期服务将每一项服务与一个租约关联,当租
System.Globalization 包含定义区域性相关信息的类,这些信息包括语言、国家/地区、正在使用的日历、日期的格式模式、货币、数字以及字符串的排序顺序。
System.IO 包含允许对数据流和文件进行同步和异步读写的类型。
System.IO.IsolatedStorage 包含允许船舰和使用独立存储区的类型。通过使用这些存储区,可以读写信任度较低的代码无法访问的数据,防止公开可保存在文件系统其

不同文件相同命名空间同名函数

不同文件相同命名空间同名函数

《不同文件相同命名空间同名函数》在软件开发中,我们经常面临文件管理和命名空间管理的挑战。

特别是当不同文件中存在相同命名空间和同名函数时,就需要对其进行深入的理解和处理。

在本文中,我们将探讨不同文件相同命名空间同名函数的情况,以及如何有效地管理和解决这一问题。

1. 了解命名空间和函数让我们简要回顾一下命名空间和函数的概念。

命名空间是一种组织和管理代码的机制,它可以避免名称冲突并提高代码的可维护性。

而函数则是一段封装了特定功能的代码块,它可以被其他程序或代码调用并执行特定的任务。

2. 不同文件相同命名空间同名函数的问题当我们在不同文件中定义了相同命名空间和同名函数时,就会出现命名冲突的问题。

编译器无法区分应该调用哪个命名空间下的函数,从而导致编译错误或者运行时错误。

这会给软件开发和维护带来诸多困难和挑战。

3. 解决方案针对不同文件相同命名空间同名函数的问题,我们可以采取以下解决方案:- 使用命名空间别名:在不同文件中为相同命名空间使用不同的别名,这样就可以避免命名冲突。

- 使用命名空间嵌套:将相同命名空间下的函数放置在不同的嵌套命名空间中,以区分它们的来源和作用范围。

- 使用静态成员函数:将函数声明为静态成员函数,这样就不会产生命名冲突,因为静态成员函数是与类相关联,而不是与对象相关联的。

- 使用命名空间限定符:在调用函数时,使用命名空间限定符来明确指定函数所属的命名空间,以避免歧义和冲突。

4. 个人观点和理解对于不同文件相同命名空间同名函数的问题,我认为避免命名冲突是关键所在。

通过合理地管理和组织命名空间,并且充分利用命名空间别名、嵌套、静态成员函数和限定符等技术手段,我们可以有效地解决这一问题,并且在软件开发过程中提高代码的可维护性和可靠性。

在本文中,我们深入探讨了不同文件相同命名空间同名函数的情况,并提出了相应的解决方案。

通过对这一主题的全面评估和理解,相信你对命名空间和函数管理的挑战已经有了更深入的了解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第4讲命名空间快乐乔巴的博客视频讲师:陈广老师大家好,今天我们来讲一下命名空间,通常一个软件项目包含类可能成千上万,如果2个以上的类有相同的名称时该怎么办呢?在C#中您可以使用命名空间就是namespace来解决命名冲突的问题,C#中命名空间其实就类似于Java中的Package 就是包,在C#中命名空间可以用来定义C#类的范围。

PPT:.NET Framework类库由命名空间组成。

每个命名空间都包含可在程序中使用的类型:类,结构,枚举,委托和接口。

下面我们来做个例子来看看如何声明namespace,创建一个namesapce.cs文件,ing System;2.//使用namespace关键字,后面是命名空间的名称CG3.//在大括号之间的所有代码都属于这CG命名空间space CG5.{6.//声明一个类Test7.class Test8. {9.static void Main()10. {11.//打印一行My name is CG12. Console.WriteLine("My name is CG");13. }14. }15.}保存文件后进行编译执行,效果如下:屏幕上打印出了我们刚才输入的这行字符,看我们刚才的代码。

在这个例子中,在CG这个命名空间之下声明了一个类,当然这个类很简单,只是在屏幕上打印一行字。

我们当然可以在这个命名空间下声明很多个类,去实现不同的功能。

我们接下来把输出语句放到别的命名空间下,下面我们来试一下。

我们首先在原代码中声明另一个命名空间,这个命名空间的名字叫A。

A地下声明一个类,详细请看代码:ing System;2.//使用namespace关键字,后面是命名空间的名称CG3.//在大括号之间的所有代码都属于这CG命名空间space CG5.{6.//声明一个类Test7.class Test8. {9.static void Main()10. {11.//我们在入口函数里调用A命名空间里的PrintName类底下的intro这个函数12.//首先声明PrintName类,前面要加上命名空间的名称13.//并且对其初始化14. A.PrintName a= new A.PrintName();15.//可以使用a实例中的intro函数了16. a.intro();17. }18. }19.}20.21.//声明另外一个命名空间Aspace A23.{24.//声明一个类PrintName25.public class PrintName26. {27.//写个输出的函数28.public void intro()29. {30. Console.WriteLine("My name is A");31. }32. }33.}好,我们进行编译执行程序,效果如下:屏幕上成功打印了My name is A,也就是说我们调用了A这个命名空间PrintName 类底下的intro这个函数。

当我们在CG命名空间下想使用A命名空间下的函数,(A.PrintName)则必须要在它的类前面加上A这个命名空间的前缀,才能去使用它。

下面我们再声明另外一个命名空间B,它里面的代码和A命名空间里的代码完全一样,ing System;2.space CG4.{5.class Test6. {7.static void Main()8. {9. A.PrintName a= new A.PrintName();10. a.intro();11.//初始化B命名空间下的PrintName类12. B.PrintName b = new B.PrintName();13.//调用intro函数14. b.intro();15. }16. }17.}18.19.//声明另外一个命名空间Aspace A21.{22.//声明一个类PrintName23.public class PrintName24. {25.//写个输出的函数26.public void intro()27. {28. Console.WriteLine("My name is A");29. }30. }31.}32.//再声明另外一个命名空间Bspace B34.{35.//声明一个类PrintName36.public class PrintName37. {38.//写个输出的函数39.public void intro()40. {41. Console.WriteLine("My name is B");42. }43. }44.}进行编译执行查看效果,如图:在这里呢,分别调用了A命名空间里的intro函数和B命名空间里的intro函数。

而且,它们底下的类PrintName和类下的函数intro都是一模一样的。

但是通过了它们的命名空间的前缀,将它们区分开来,也就是说,在C#中只要使用了命名空间就不必担心你写的类会跟其他人所写的类有相同的名称。

下面我们来看一下使用命名空间的好处:PPT:1.代码可以分布在多个文件中2.命名空间具有扩展性3.可以堆砌出层次式的类组织结构我们先来看一下第三点,命名空间和类一样,允许采用嵌套的结构,一个命名空间可以包含其他命名空间,形成层次式结构,以更容易分组,管理。

好,我们再修改下代码,在A和B命名空间上嵌套一个命名空间A,把A和B命名空间的名称改为A1,ing System;2.space CG4.{5.class Test6. {7.static void Main()8. {9.//访问的命名路径名要完整10. A.A1.PrintName a = new A.A1.PrintName();11. a.intro();12. A.A2.PrintName b = new A.A2.PrintName();13. b.intro();14. }15. }16.}space A18.{space A120. {21.public class PrintName22. {23.public void intro()24. {25. Console.WriteLine("My name is A");26. }27. }28. }space A230. {31.public class PrintName32. {33.public void intro()34. {35. Console.WriteLine("My name is B");36. }37. }38. }39.}我们再编译执行后效果也是一样的。

A命名空间下有A1和A2这2个命名空间,要找到他们的类和访问他们的函数时,就必须在初始化实例的时候需要给出全路径名(A.A1.PrintName a = new A.A1.PrintName();),这样呢就形成了层次式的结构,以更容易的分组和管理。

我们再来看下使用命名空间的好处。

第一点:代码可以分布在多个文件中。

在同一个命名空间下的不同类可以分布在多个文件中存储,不过在使用嵌套类的时候要小心,他们必须在同一个文件中。

不可以跨不同文件存在,下面我们把代码再修改下。

把这个类移植到另外一个文件中,我们新建一个文件,名字叫PrintName.cs。

里面的命名空间名也是CG,namespace.cs和printName.cs代码如下:ing System;2.space CG4.{5.public class PrintName6. {7.public void intro()8. {9. Console.WriteLine("My name is A");10. }11. }12.}ing System;2.space CG4.{5.class Test6. {7.static void Main()8. {9. PrintName a = new PrintName();10. a.intro();11. }12. }13.}这个时候,我们要对这2个文件进行同时编译,csc时后面跟2个文件名,中间用空格隔开,然后执行namespace,效果如图所示:好,结果出来了。

我们回头看一下代码。

我们在主文件中(namespace.cs)中使用了CG这个命名空间,在PrintName文件中也使用了CG这个命名空间。

换句话说,相同的命名空间可以分布在不同的文件之中,而在调用的时候,不需要再次去引用这个类的命名空间的前缀了,这样呢使我们的管理变得方便很多。

在实际的编程中,如果程序较大而且会频繁的更新,则需要把程序分布在不同的文件之中。

就比如我们玩网络游戏,一个游戏的大小有1G,而且一个星期就要更新一次,如果游戏的程序放在一个文件之中,那通过网络更新的时候我想再强健的网络也会受不了。

但如果把一个程序分布在多个文件之中,哪个文件更改就下载哪个文件,这样就不会存在网络问题了。

在C#中,你可以把类库编译成dll文件,供程序调用。

下面我们来试一下把PrintName做成dll文件。

进入命令行窗口,进入到我们放PrintName文件的地方,输入csc /target:library PrintName.cs,如图所示:我们去看看放置PrintName.cs文件下,已经产生了一个PrintName.dll的文件了。

如图所示:/target:library 代表着把cs文件编译成dll文件,接下来我们把主文件和dll文件进行相关联,并编译,还是使用csc命令,输入csc /reference:PrintName.dll namespace.cs,这里的reference表示跟某个dll进行关联。

关联后然后我们再执行namespace程序。

如图所示:屏幕上正常输出了My name is A。

好,接下来我们把程序稍改一下,就当这个游戏需要更新了。

我们把PrintName文件中的输出语句内容改下,改成My name is B。

然后我们对这个PrintName文件重新编译dll,输入csc /target:library PrintName.cs,编译成功后我们直接执行namespace看看效果如何:好,我们看到屏幕的输出改变了,它由原来的My name is A改成了My name is B,也就是说我们不需要再编译exe文件,而只编译它所调用到的dll文件,这使得我们对程序作出修改时不至于重新编译整个程序,这样做的好处是显而易见的。

我们现在来看一下第二点:命名空间具有扩展性。

你可以在命名空间中增加新类,而不影响其他已存在于此命名空间的类,使得设计灵活性更高。

相关文档
最新文档