C#命名空间详解namespace
C#命名空间详解namespace
命名空间是一个域,这在个域中所有的类型名字必须是唯一的,不同的类型分组归入到层次化的命名空间,
命名空间的好处是:1、避免名字冲突,2、便于查找类型名字。
如:System.secruity.Cryptogtaphy.
下面介绍namespace 关键字的使用。
namespace test{class class0{int i;public class0(){}}
}
using关键字使用
,访问一个命名空间的内容可以通过完全限定名。如:test.class0来访问。但是每次这样在程序写很麻烦。你可以使用using指令来引用类型。
命名空间的都是引用类型的。所以在程序的开头你可以先引用命名空间。就像你使用VS编译软件时,每个系统生成的Console中都有
using system;using system.drawing;using system.threading ;
之后就可以很方面使用你引用命名空间的类型了。注意using的使用,后面的还要对此做介绍。
全局命名空间
全局命名空间有两部分组成:
1、所有的顶级命名空间;
2、所有没有在任何命名空间中声明的类型;
例如:前面的例子的全局命名空间中声明了test类型(属于第一种情况。)
例如:class outer{}//属于第二种情况;
namespace test1{}是全局命名。
命名空间的规则
名字作用域
所有出现的外部命名空间中的名字都隐式地被引入到内部的命名空间中。在这个例子中middle 和class1被隐式的引入到inner中;
namespace Outer{namespace Middle{class Class1{}namespace inner{class class2:class1{}}}
}
在这个例子中:如下:
namespace test{namespace Common{class class1{}}namespace Managerreporting{class class2:Common.class1{}}}
可以看到一个test命名空间中包含两个不交的命名空间。要想引用另外一个,必须使用部分限定名。你可以看出他和上面的例子的区别吗?
名字屏蔽
内部命名空间的名字会屏蔽外部空间相同的名字。
例如;
namespace Outer{namespace Middle{class class1{}class class2{}}namespace Inner{class class1{class2 cInner;Middle.class2 couter;}class class2{}}}
在这个例子中。在OUter命名空间声明了两个命名空间,在Inner命名空间中,CInner引用的是Inner.class2的类型。COUter引用的是Middle.class2类型。一个大括号表示程序运行结束时,释放里面的临时变量。屏蔽功能仅仅是使用简单的名字引用某个类型有影响。如果想引用Middle命名空间的class2 的类型。你可以乡引用couter一样。用部分限定名或完全限定名。你必须知道屏蔽对于运行时语义并没有什么影响。(因为编译器在解析命名空间规则时,总是将名字转化为完全限定名。编译后生成的IL语言不会包括无限定的或部分限定名。
重复命名空间
可以重复的声明一个命名空间,只要命名空间的类型名字没有冲突;
namespace outer.middle.inner{class class1{}
}namespace outer.middle.inner{class class2{}}
个人认为可以想下函数的重载。
甚至可以把这个例子分成两个源文件这样就可以将每一个类编译进不同的汇编代码中;
源文件#1
namespace outer.middle.inner{class class1{} }
源文件#2
namespace outer.middle.inner{class class2{}}
嵌套指令Using
可以在一个命名空间中嵌套using指令。这样可using指令的作用域限定在命名空间的声明中。
namespace N1{class class1{}}namespace N2{using N1;class class2:class1{}}//compile true;namespace N3{class class3:class1{}}//compile error
注意说明下这样的写,在VS中是无法通过的,还记得前面说的吗?要想引用层次中的类型,必须加上部分或者完全限定名吗?
类型别名和命名空间
引入命名空间可能导致类型名冲突,与其说引入命名空间的全部,不如仅选择要使用的类型引人,给每个要使用的一个别名。
using p=system。reflection
class program{p f;}
但是我们完全没有必要这样做。因为我们可以把它们变成全局的引用。就乡你打开vs时,生成的console一样。
高级命名空间特性
Extern
外部命名空间允许相同的名字出现。只要包含的类型不同就可以。这种情况最容易发生在来自不同的文件中。
库#1:
namespace Widgets{public class Widget{}}
库#2:
namespace Widgets{
public class Widget{}
}
程序:
using Widgets;namespace test{static void Main(){Widget w=new Widget();
}//compile errror;}
这个程序不正确的,是因为Widget是不确定的。
解决这个问题就是引用完全限定名。
csc /r:W1=WIdgets1.dll /rW2=Widgets2.dll application.cs
或者使用extern alias W1;extern alias W2;
命名空间别名限定
前面提到,内层命名空间的名字会屏蔽外层命名空间的名字。然而。有时候即使使用完全限定类型也不能解决这个冲突。如下:
namespace N{class A{public class B{}static void Main(){new A.B();
}}
}namespace A{class B{}
}
这个在运行的是嵌套的B。注意在VS中同一个文件中不可包含同样的命名空间和类型。但在不同文件可能出现。
有两种办法解决可能出现的命名空间冲突问题:
1、使用上面讲的使用别名进行。
2、global命名空间----所有的命名空间的根。
namespace test{static void Main(){system.Console.WriteLine(new A.B());System.Console.WriteLine(new global::A.B());}
}
别名限定:
external alias W1;external alias W2;namespace test{static void Main(){W1.Widgets.Widget w1=new W1.Widgets.Widget();W2.Widgets.Widget w2=new W2.Widgets.Widget();}}
namespace 的内容就讲完了,如有什么错误还请指正。
C#命名空间详解namespace相关推荐
- 【细品C++】命名空间详解(namespace)
观前提示 看完本篇文章需要8到10min,如仅需复习看下使用规则请跳转观看 文章目录 观前提示 写在前面 为什么有命名空间 命名空间定义 命名空间使用 结语 彩蛋 写在前面 本篇文章是C++中的命名空 ...
- 双冒号作用运算符以及命名空间详解
转载地址:双冒号作用运算符以及命名空间详解,你确定不来看看吗?_敲键盘的喵的博客-CSDN博客 一.双冒号作用域运算符 通常情况下,如果程序中即存在局部变量又存在全局变量,局部变量将会获得较高的优先权 ...
- c语言中常用命名空间,C语言命名空间详解.doc
C语言命名空间详解 C语言命名空间详解 C语言命名空间分析准则: 在同一命名空间.相同作用域中,任何名字须具有唯一性 每个结构和联合内部都有自己的命名空间(独立于其他空间) 结构标签.联合标签.枚举标 ...
- linux网络命名空间详解,Linux Network Namespace (netns) 详解
Linux Network Namespace (netns) 详解 Network Namespace (以下简称netns)是Linux内核提供的一项实现网络隔离的功能,它能隔离多个不同的网络空间 ...
- 未能找到类型或命名空间名称_命名空间详解
命名空间与类型有些相似,在类型中可以声明诸多成员:字段,属性,方法而在命名空间中可以声明:类,接口命名空间属于逻辑组合,用来对类型的功能进行逻辑分组成员根据相关性可以将name, age, sex成员 ...
- 双冒号作用运算符以及命名空间详解,你确定不来看看吗?
文章目录 前言 一.双冒号作用域运算符 二.c++命名空间(namespace) 1.用途 2.命名空间使用语法 2.1 创建一个命名空间 2.2 命名空间只能定义为全局变量 2.3命名空间可以嵌套命 ...
- linux网络命名空间详解,『中级篇』 Linux网络命名空间(25)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』 Linux网络命名空间(25) docker底层技术,非常重要的关于namespace,network的names ...
- kubernetes不同的命名空间下的容器能通信吗_超长干货 | Kubernetes命名空间详解
本文中,我们将探索Kubernetes命名空间,它是集群中组织和管理对象的一种方式. 介 绍 Kubernetes集群可以同时管理大量互不相关的工作负载,而组织通常会选择将不同团队创建的项目部署到共享 ...
- 全网最详系列教程-nacos配置中心详解-NameSpace、Group、DataID
特别喜欢李白的一句诗:俱怀逸兴壮思飞,欲上青天揽明月.其表达了对光明世界的执着追求.我亦身为三等码农,也向往着能够改变世界. 文章目录 1.命名空间.分组.DataID三者之间的关系 2.DataID ...
最新文章
- 机器学习中的逻辑回归
- maven的dependency 和 dependencymanagement
- Linux入门基础(1)
- Java全栈工程实践
- Windows语音通话SDK集成及功能实现(实时语音通话四)
- 推荐一个免费且超快的 MDK 资源下载链接
- 删除hive的分区元数据,spark总是读取到已经删掉的分区
- 2018年最后一个工作日
- 基于js实现页面图片消除
- 如何在三个月内获得三年的工作经验(转载)
- 复变函数可视化以及代数基本定理
- DApp引荐机制正式上线 | IOST开发者赏金计划
- 旋转角度如何知道是顺时针还是逆时针旋转?(仅供参考,更靠谱的是旋转轴到z轴正半轴上)
- 《移动App测试实战》读书笔记
- 至联云解析:为什么说web3.0是IPFS的天下?
- C4D 导obj_初学C4D,一定要注意这些容易被忽略的重点
- Tensorflow--tutorial--建造神经网络(输入层,隐藏层,输出层)
- 浅谈Go语言(7) - 接口与指针
- 如何构建数据血缘系统
- iPhone6和iPhone6 Plus 尺寸