命名空间

C#10 新功能====================

命名空间格式:声明所有后续声明都是已声明的命名空间的成员:

//C#10 命名空间的新写法,这种方式一个文件只能有一个命名空间。
//命名空间后面只能是类名、枚举、结构
namespace MyNamespace;
public class P { }
public class Pr { }

也可以不行命名空间,这种方式编译成dll时候,所有的内容会默认防止 类Program 的main函数里面。而Proram 没有命名空间.

Proram 没有命名空间,所有在写反射时候,Program前面没有命名空间。

Assembly se=Assembly.GetExecutingAssembly();
Type typ= se.GetType("Program", false);
//正常的类,前面应该加命名空间
Assembly se=Assembly.GetExecutingAssembly();
Type typ= se.GetType("NameSpace.Program", false);

全局的 using#

利用全局 using 可以给整个项目启用 usings,不再需要每个文件都写一份。比如你可以创建一个 Import.cs,然后里面写:

Copy
using System;
using i32 = System.Int32;

然后你整个项目都无需再 using System,并且可以用 i32 了。

===============================

命名空间是一系列类型名称的领域。通常情况下,类型组织在分层的命名空间里,既避免了命名冲突又更容易查找。例如,处理公钥加密的RSA类型就定义在如下的命名空间下:

System.Security.Cryptography

命名空间组成了类型名的基本部分。下面代码调用了RSA类型的Create方法:

System.Security.Cryptography.RSA rsa=System.Security.Cryptography.RSA.Create();

命名空间是独立于程序集的。程序集是像.exe或者.dll一样的部署单元。命名空间并不影响成员的public、internal、private的可见性。

namespace关键字为其中的类型定义了命名空间。例如:

namespace outer.Middle .Inner

{
class classl { } class Class2 { } }

命名空间中的“.”表明了嵌套命名空间的层次结构。下面的代码在语义上和上一个例子是等价的:

namespace outer(
namespace Middle{
namespace Inner{
class Classl {}class Class2 {}}
})

类型可以用完全限定名称(fully qualified name),也就是包含从外到内的所有命名空间的名称,来指定。例如,上述例子中,可以使用Outer.Middle.Inner.Class1来指代Class1。

如果类型没有在任何命名空间中定义,则它存在于全局命名空间(global namespace)中。全局命名空间也包含了顶级命名空间,就像前面例子中的Outer命名空间。

1、using指令

using指令用于导入命名空间。这是避免使用完全限定名称来指代某种类型的快捷方法。以下例子导入了前一个例子的Outer.Middle.Inner命名空间:

using outer.Middle . Inner;class Test
{
static void Main ( ){
classl c;l/ Don't need fully qualified name}
}

在不同的命名空间定义相同名称的类型是完全合法的,这也是命名空间存在的最基本的意义。然而,假设开发者同时导入了这些命名空间,在引用同名类型时会收到来自编译器的错误,(这个问题可以用2.3.5小节的类型和命名空间别名解决)。

2、using static指令

从C#6开始,我们不仅可以导入命名空间还可以使用using static指令导入特定的类型。这样就可以直接使用类型静态成员而不需要指定类型的名称了。在接下来的例子中,我们这样调用Console类的静态方法WriteLine:

using static system.Console;class Test
{
static void Main(){ writeLine ( "Hello");})

using static指令将类型的可访问的静态成员,包括字段、属性以及嵌套类型(后续章节会讲解),全部导入进来。同时,该指令也支持导入枚举类型的成员(后续章节会讲解)。因此如果导入了以下的枚举类型:

using static System.Windows.Visibility;

我们就可以直接使用Hidden而不是Visibility.Hidden了:

var textBox = new TextBox { Visibility = Hidden }; // XAML- style

C#编译器还没有聪明到可以基于上下文来推断出正确的类型,因此在导入多个静态类型导致二义性时会发生编译错误。

3、命名空间中的规则

3.1、名称范围

外层命名空间中声明的名称能够直接在内层命名空间中使用。以下示例中的Class1在Inner中不需要限定名称:

namespace outer{
class Classl { }
namespace Inner{
class Class2 : classl{ }}
)

使用统一命名空间分层结构中不同分支的类型需要使用部分限定名称。在下面的例子中,SalesReport类继承Common.ReportBase:

namespace MyTradingcompany{
namespace C ommon
class ReportBase { }}
namespace ManagementReporting{
class salesReport : Common. PeportBase{ }}
}

3.2、名称隐藏

如果相同类型名称同时出现在内层和外层命名空间中,则内层类型优先。如果要使用外层命名空间中的类型,必须使用它的完全限定名称。

namespace outer
class Foo { }
namespace Inner{
class Foo { }
class Test{
Foo fl;
// - outer .Inner.Foo
outer.Foo f2;/l = outer.Foo
)
})

所有的类型名在编译时都会转换为完全限定名称。中间语言(IL)代码不包含非限定名称和部分限定名称。

3.3、重复的命名空间

只要命名空间内的类型名称不冲突就可以重复声明同一个命名空间:

namespace outer.Middle .Inner{
class Class1 {}}
namespace outer. Middle . Inner{
class class2 {}

上述例子也可以分为两个不同的源文件,并将每一个类都编译到不同的程序集中(这个用处很大)。

3.4、嵌套的using指令

我们能够在命名空间中嵌套使用using指令,这样可以控制using指令在命名空间声明中的作用范围。在以下例子中,Class1在一个命名空间中可见,但是在另一个命名空间中不可见:

name space N1{
class Classl { }}
namespace N2

{
using Nl;
class class2 : class1 { }

}
namespace N2
{
class Class3 : class1 {}l /compile-time error
 }

3.5、类型和命名空间别名

导入命名空间可能导致类型名称的冲突,因此可以只导入需要的特定类型而不是整个命名空间,并给它们创建别名。例如:

using PropertyInfo2 = system.Reflection.PropertyInfo;class Program{ PropertyInfo2 p; }
下面代码为整个命名空间创建别名:

using R = system.Reflection;
class Program { R.PropertyInfo p; }

【C# 基础概念】命名空间的更多相关文章

  1. 快速入门系列--WCF--01基础概念

    转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...

  2. Hadoop基础概念介绍

    基于YARN的配置信息, 参见: http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/ hadoop入门 - 基础概念 ...

  3. .NET技术面试题系列(1) 基础概念

    这是.NET技术面试题系列第一篇,今天主要分享基础概念. 1.简述 private. protected. public.internal 修饰符的访问权限 private : 私有成员, 在类的内部 ...

  4. 九. Python基础(9)--命名空间, 作用域

    九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...

  5. .NET基础 (01).NET基础概念

    .NET基础概念 1 什么是CTS.CLS和CLR2 开发和运行.NET程序需要的最基本环节是什么3 .NET是否支持多编程语言开发4 CLR技术和COM技术的比较5 什么是程序集和应用程序域 1 什 ...

  6. WCF分布式开发步步为赢(1):WCF分布式框架基础概念

    众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推 ...

  7. C#学习基础概念二十五问

    C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...

  8. [转帖]从0开始的高并发(一)--- Zookeeper的基础概念

    从0开始的高并发(一)--- Zookeeper的基础概念 https://juejin.im/post/5d0bd358e51d45105e0212db 前言 前面几篇以spring作为主题也是有些 ...

  9. kubernetes基础概念知多少

    kubernetes(简称k8s)是一种用于在一组主机上运行和协同容器化应用程序的管理平台,皆在提供高可用.高扩展性和可预测性的方式来管理容器应用的生命周期.通过k8s,用户可以定义程序运行方式.部署 ...

  10. K8s(一)----容器编排工具基础概念

    kubernetes(k8s)容器编排工具基础概念 Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controlle ...

随机推荐

  1. go get失败解决办法

    go get时由于防火墙的原因,会导致失败.目前可以通过修改GOPROXY的方法解决该问题. 无论是在win下还是linux,macos下,只需要将环境变量GOPROXY设置成https://gopr ...

  2. insert插入日期

    7.5.insert插入日期 数字格式化:format select ename,sal from emp: 格式化数字:fromat(数字,'格式') select ename,format(sal ...

  3. java-包与包之间的访问

    1 package face_package; 2 3 import face_packagedemoA.DemoA; 4 5 /* 包(package) 6 * 1,对类文件进行分类管理. 7 * ...

  4. CTFSHOW-SSRF篇

    之前就想着写一下 ctfshow 的 wp, 但由于时间问题,一直没有机会, 其实是懒≥.≤ 这次趁着寒假刷几篇ctfshow的文章 那,开始吧. web351 存在一个flag.php页面,访问会返 ...

  5. Kindle连接移动的 Wi-Fi 时要求进行网页浏览器登陆怎么办?

    在电脑上新建一个新文件,名为"WIFI_NO_NET_PROBE",同时把后缀名删掉,让它变成一个无格式文件.Kindle 连接电脑,把新建的文件放进Kindle的根目录,断开Ki ...

  6. python列表删除和排序

    1.del message[0]---知道位置不知道值 2.message.remove('a')----知道值不知道位置 3.message.sort()--正向永久排序 4.message.sor ...

  7. 【转】Nestable可拖拽树

    原文地址:https://blog.csdn.net/wangmj518/article/details/81746523 Nestable是基于Bootstrap的一个可拖拽的树结构表现插件. 下面 ...

  8. Core Animation的使用步骤

  9. 使用Java开发桌面即时通讯程序遇到的问题

    项目:https://www.lking.top/?p=87 1. JPanel面板绘制背景图片问题. 参考大佬:https://www.jb51.net/article/101516.htm 本项目 ...

  10. uniapp自定义顶部搜索框兼容微信小程序

    zhuanzai:  uniapp自定义顶部搜索框兼容微信小程序 自定义组件 navbarvue (胶囊底部高度 - 状态栏的高度) + (胶囊顶部高度 - 状态栏内的高度) = 导航栏的高度 < ...