命名空间是一个域,这在个域中所有的类型名字必须是唯一的,不同的类型分组归入到层次化的命名空间,

命名空间的好处是: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的更多相关文章

  1. linux命名空间详解_转

    转自: Linux的命名空间详解--Linux进程的管理与调度(二) Linux Namespaces机制提供一种资源隔离方案. PID,IPC,Network等系统资源不再是全局性的,而是属于特定的 ...

  2. c++的重载 缺省参数和命名空间详解

    参加了几次笔试,发现有很多c++方面的问题被卡了.从现在开始进攻c++.之后会陆续更新c++学习笔记. 先说说我学习的书籍,大家如果有好的书籍推荐,感谢留言. 暂时是在看这些书自学. 1.C++介绍. ...

  3. c++ namespace命名空间详解

    What is a namespace? A namespace defines an area of code in which all identifiers are guaranteed to ...

  4. django 命名空间详解

    include(module[, namespace=None, app_name=None ]) include(pattern_list) include((pattern_list, app_n ...

  5. Linux的命名空间详解--Linux进程的管理与调度(二)【转】

    Linux Namespaces机制提供一种资源隔离方案. PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace.每个Namespace里面的资源对其他Namesp ...

  6. Linux的命名空间详解--Linux进程的管理与调度(二)

    转自:http://blog.csdn.net/gatieme/article/details/51383322 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux- ...

  7. Thinkphp5.0实战开发一------命名空间详解

    序言 ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,使用ThinkPHP框架可以极大简化我们的开发过程,节省时间.这个专题我将记录自己学习使用ThinkPHP5.0的进行实战开发 ...

  8. C++命名空间详解

    使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突.在C++中,变量.函数和类都是大量存在的.如果没有命名空间,这些变量.函数.类的名称将都存在于全局命名空间中,会导致很多冲突.比如,如果我 ...

  9. XML和Schema命名空间详解

    来源:https://blog.csdn.net/wanghuan203/article/details/9204337 XML和Schema具有无关平台,技术厂商,简单,规范统一等特点,极具开放性, ...

随机推荐

  1. [Linux]shell编程基础/linux基础入门

    声明执行程序 #!/bin/bash 用来告诉系统使用/bin/bash 程序来执行该脚本.譬如python 脚本,可以这样写: #!/usr/bin/python   赋值和引用 赋值公式: 变量名 ...

  2. 关于清晰讲解linux正则表达式的博文分享

    http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html  linux shell 正则表达式(BREs,EREs,PREs)差异比 ...

  3. KMP算法java实现

    /** * 假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置 如果j = -1,或者当前字符匹配成功(即S[i] == * P[j]),都令i++,j++,继续匹配下一个字符: 如果j != ...

  4. 网易云课堂_C语言程序设计进阶_期末考试编程题部分

    1 字符串循环右移(5分) 题目内容: 输入一个字符串和一个非负整数N,要求将字符串循环右移N次. 输入格式: 输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未 ...

  5. ps 导出png-8图片会变模糊

    出现这种情况的时候,在保存png-8图片的时候,索引色需要改为256,否则保存的图片颜色与原图会不一致.

  6. JAVA程序猿面试题汇总

    (此话题将不断更新,请留意) 第一,谈谈final, finally, finalize的差别. final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.finally是异常 ...

  7. C和指针 (pointers on C)——第五章:操作符和表达式

    第五章 操作符和表达式 这一章假设没做过玩过单片机.汇编的话,读起来可能比較吃力,尤其是在移位运算符.位运算符应用上.另外多注意一下左值和右值的理解. 总结: 算术操作符.赋值操作符.关系操作符.条件 ...

  8. cql

    创建keyspace :CREATE KEYSPACE keyspace1 WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': ...

  9. C#运用实例.读取csv里面的词条,对每一个词条抓取百度百科相关资料,然后存取到数据库

    第一步:首先需要将csv先装换成datatable,这样我们就容易进行对datatable进行遍历: /// 将CSV文件的数据读取到DataTable中 /// CSV文件路径 /// 返回读取了C ...

  10. CSS中为什么overflow:hidden能清除浮动(float)的影响?原理是什么?

    http://www.zhihu.com/question/30938856 父块没有设置指定的高宽,当子块设置为浮动后,原本包裹子块的父块的高度塌陷消失,这时给父块设置overflow:hidden ...