【C# 基础概念】命名空间
命名空间
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,然后里面写:
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# 基础概念】命名空间的更多相关文章
- 快速入门系列--WCF--01基础概念
转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...
- Hadoop基础概念介绍
基于YARN的配置信息, 参见: http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/ hadoop入门 - 基础概念 ...
- .NET技术面试题系列(1) 基础概念
这是.NET技术面试题系列第一篇,今天主要分享基础概念. 1.简述 private. protected. public.internal 修饰符的访问权限 private : 私有成员, 在类的内部 ...
- 九. Python基础(9)--命名空间, 作用域
九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...
- .NET基础 (01).NET基础概念
.NET基础概念 1 什么是CTS.CLS和CLR2 开发和运行.NET程序需要的最基本环节是什么3 .NET是否支持多编程语言开发4 CLR技术和COM技术的比较5 什么是程序集和应用程序域 1 什 ...
- WCF分布式开发步步为赢(1):WCF分布式框架基础概念
众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推 ...
- C#学习基础概念二十五问
C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...
- [转帖]从0开始的高并发(一)--- Zookeeper的基础概念
从0开始的高并发(一)--- Zookeeper的基础概念 https://juejin.im/post/5d0bd358e51d45105e0212db 前言 前面几篇以spring作为主题也是有些 ...
- kubernetes基础概念知多少
kubernetes(简称k8s)是一种用于在一组主机上运行和协同容器化应用程序的管理平台,皆在提供高可用.高扩展性和可预测性的方式来管理容器应用的生命周期.通过k8s,用户可以定义程序运行方式.部署 ...
- K8s(一)----容器编排工具基础概念
kubernetes(k8s)容器编排工具基础概念 Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controlle ...
随机推荐
- golang中goroutine
1. 概念 goroutine 奉行通过通信来共享内存,而不是共享内存来通信 goroutine 是由go的运行时(runtime)调度和管理的 go程序会智能的将goroutine中的任务合理的分配 ...
- java接口概述及特点
1 package face_09; 2 3 4 5 6 abstract class AbsDemo{ 7 abstract void show1(); 8 abstract void show2( ...
- Kubernetes中部署wordpress+mysql(六)
经过前面的内容其实对k8s已经有了服务迁移的能力了,下面这篇文章主要是用来搭建一些后面要用的组件 一.创建wordpress命名空间 kubectl create namespace wordpres ...
- Python解释器下载安装教程
简介: 自从20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程.2021年10月,语言流行指数的编译器Tiobe将Python加冕为最受欢迎的编程语言,20 ...
- CPU Cache与缓存行
编译环境:windows10+Idea+x86 CPU. 1.CPU Cache CPU 访问内存时,首先查询 cache 是否已缓存该数据.如果有,则返回数据,无需访问内存:如果不存在,则需把数据从 ...
- new Date时间格式转换方法
平时经常会使用到时间转换,组件库已经有很多组件可以自动生成时间类型了,但是底层的封装方法还是得有 获取当前时间 new Date() 或者自己拥有一个毫秒时间 方法如下 /** * title: 时 ...
- 入门- k8s发布应用服务 (五)
目标 了解 Kubernetes 的 Service(服务) 了解 Labels(标签)和 LabelSelector(标签选择器)与 Service(服务)的关系 在 kubernetes 集群中, ...
- Java线程--LockSupport使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871805.html Java线程--LockSupport使用 public static ...
- 浅谈Java之属性赋值的先后顺序
首先,什么是属性? 属性也叫作成员变量,是类的组成部分之一. 我们都知道Java一个类可以包含有: 属性,或者成员变量 构造器 方法,或者叫函数 代码块,或者叫程序段 内部类 那么结合这些,我们就有了 ...
- python基础语法_10错误与异常
Python有两种错误很容易辨认:语法错误和异常. 语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 异常 即便Python程序的语法是正确的,在运行它的时候,也有可能 ...