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的更多相关文章
- linux命名空间详解_转
转自: Linux的命名空间详解--Linux进程的管理与调度(二) Linux Namespaces机制提供一种资源隔离方案. PID,IPC,Network等系统资源不再是全局性的,而是属于特定的 ...
- c++的重载 缺省参数和命名空间详解
参加了几次笔试,发现有很多c++方面的问题被卡了.从现在开始进攻c++.之后会陆续更新c++学习笔记. 先说说我学习的书籍,大家如果有好的书籍推荐,感谢留言. 暂时是在看这些书自学. 1.C++介绍. ...
- c++ namespace命名空间详解
What is a namespace? A namespace defines an area of code in which all identifiers are guaranteed to ...
- django 命名空间详解
include(module[, namespace=None, app_name=None ]) include(pattern_list) include((pattern_list, app_n ...
- Linux的命名空间详解--Linux进程的管理与调度(二)【转】
Linux Namespaces机制提供一种资源隔离方案. PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace.每个Namespace里面的资源对其他Namesp ...
- Linux的命名空间详解--Linux进程的管理与调度(二)
转自:http://blog.csdn.net/gatieme/article/details/51383322 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux- ...
- Thinkphp5.0实战开发一------命名空间详解
序言 ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,使用ThinkPHP框架可以极大简化我们的开发过程,节省时间.这个专题我将记录自己学习使用ThinkPHP5.0的进行实战开发 ...
- C++命名空间详解
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突.在C++中,变量.函数和类都是大量存在的.如果没有命名空间,这些变量.函数.类的名称将都存在于全局命名空间中,会导致很多冲突.比如,如果我 ...
- XML和Schema命名空间详解
来源:https://blog.csdn.net/wanghuan203/article/details/9204337 XML和Schema具有无关平台,技术厂商,简单,规范统一等特点,极具开放性, ...
随机推荐
- 2.5 Local Methods in High Dimensions
curse of dimensionality 输入在p维立方体中符合均匀分布,如果需要覆盖比例r的体积,需要每个维度上\(e_p(r)=r^{1/p}\) \(e_{10}(0.01)=0.63,e ...
- Centos下需安装Pytnon,Pytharm
1.在www.python.org/PIPY/下载python3.4.2.tar.gz 2.在安装之前最好先安装相关的开发工具 # yum groupinstall develtools # yum ...
- 查询本天气预报Web Services支持的国内外城市或地区信息
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangkui.blog.51cto.com/1796259/497324 本文 ...
- 【UVA】1449-Dominating Patterns(AC自己主动机)
AC自己主动机的模板题.须要注意的是,对于每一个字符串,须要利用map将它映射到一个结点上,这样才干按顺序输出结果. 14360841 1449 option=com_onlinejudge& ...
- Spring事务传播机制详解
1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if none ...
- EF6 Codefirst+MySql 数据库迁移
简介 项目使用MSSql作为数据库,但是因为SQL服务器贵那么一点,并发连接差那么一点,要把数据迁移到MySQL,顺带迁移过程以及问题. 环境 Visual Studio 2013 MySQL 5.7 ...
- jquery实现带左右箭头和数字焦点的图片轮播手写代码
以前图片轮播经常用网上的插件,然后想说自己也要认真看看,一步一步弄明白,所以就自己研究写了个图片轮播的代码,我自己觉得还算是挺简单的.如有改进的地方,欢迎你能帮我指出,共同进步. (ps:博客园如何上 ...
- NoSQL的价值到底在哪里?
关系型数据库的价值 持久化数据:通过数据库来保存数据 处理并发:通过事务方式处理并发 集成:共享数据库集成,多个应用程序可以同时访问同一份数据 标准模型:前几种功能已经成标准,开发人员学习成本低,虽然 ...
- c语常用算法库(1)
1,冒泡排序 #include <iostream> using namespace std; int main(){ ]; // 一共n个数, n不超过1000. a用来保存这些数. , ...
- MUD教程--巫师入门教程3
1. 指令格式为:edit <档名>,只加文件名,默认为当前目录,加here,表示编辑你当前所处的房间, 回车后即进入线上编辑系统. 2. 如果这是一个已经有的档案,你可以使用 z 或 Z ...