一、命名空间

1、通过使用using关键字引入命名空间,减少代码量

命名空间对相关的类型进行逻辑分组,通过命名空间能快速的定位到相关的类型,例如:在System.IO命名空间下,定义了所有I/O操作的类型,当我们需要使用相关的I/O操作的类型时,就可以引入该命名空间。代码如下:

public sealed class Program
{
public static void Main()
{
System.IO.FileStream fs=new System.IO.FileStream(...);
}
}

上面的代码构造了一个System.IO.FileStream对象,像这样写代码很繁琐,因为每次都需要写上类型的完全限定名,所以C#编译器提供了using指令,通过using指令导入类型的命名空间,从而避免全面限定名的方式使用类型,代码如下:

using  System.IO;
public sealed class Program
{
public static void Main()
{
FileStream fs=new FileStream(...);
}
}

原理:编译器在编译的时候,会在类型的前面加上命名空间,比如当我们使用FileStream类的时候,编译器会将FileStream类的引用解析为System.IO.FileStream.

在上面的示例代码中,编译器需要保证引用的每个类型都真实存在,而且代码以正确的方式使用类型一也就是调用确实存在的方法,向方法传递正确数量的实参,保证方法具有正确类型,正确使用方法返回值等。如果编译器在源代码文件或者引用的程序集中找不到指定的类型,就会在类型前面加上System.IO前缀,如果找不到匹配项,就逐一地在类型前面加上通过using引入的命名空间,知道找到指定的类型,否则编译就会报错,所以通过using引入命名空间的方式,能极大程度的帮助我们减少代码量.还增强了代码的可读性.

2、编译器查找类型的原理

编译器扫描引用的所有的程序集,在其中查找类型定义,一旦找到了正确的程序集,程序集信息和类型信息就被嵌入到托管模块中的元数据中.为了获取程序集信息必须将定义了被引用程序的信息传递给编译器.C#编译器自动在MSCorLib.dll程序集中查找被引用类型,即使没有显示告诉它这么做.MSCorLib.dll程序集中包含所有核心Framework(FCL类型)的定义.

3、编译器对待命名空间的方式存在潜在的问题:可能两个或者多个类型在不同的命名空间中同名,微软建议开发人员为类型定义具有唯一性的名字,但是“运行时”鼓励组件重用。例如:

应用程序可能同时使用了Microsoft和Wintellect开发的组件,假如两家公司都提供名为Widget类型,两个类型做的事情完全不同,由于干涉不了类型名称。所以当你引入Microsoft和Wintellect命名空间,并使用Widget类型时,编译器就会报CS0104:"Widget"是"Microsoft.Widget"和"Wintellect.Widget"之间不明确的引用的错.

所以必须使用一些方法来解决这个问题,以下是解决方案:

(1)、使用完全限定名称来区分并使用它们,代码如下:

Microsoft.Widget mw=new Microsoft.Widget();
Wintellect.Widget ww=new Wintellect.Widget();

(2)、C# using指令的另一种形式为类型或者命名空间创建别名,如果只想使用命名空间中的少量类型,不想它的所有类型都跑出来"污染"全局命名空间,别民就显得十分方便,代码如下:

using WintellectWidget=Wintellect.Widget;
WintellectWidget w=new WintellectWidget();

(3)、外部别名方式

自行百度

4、关于命名空间的一些建议

参考微软的命名方式,使用公司名称作为顶级名称,以减少发生冲突

C# 命名空间和程序集的更多相关文章

  1. C#图解教程 第二十一章 命名空间和程序集

    命名空间和程序集 引用其他程序集 mscorlib库 命名空间 命名空间名称命名空间的补充命名空间跨文件伸展嵌套命名空间 using 指令 using命名空间指令using别名指令程序集的结构 程序集 ...

  2. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_命名空间和程序集的关系

    命名空间和程序集不一定相关 1. 同一个命名空间中的各个类型可能是在不同的程序集中实现的.(System.IO.FileStream在MSCorLib.dll程序集中,而System.IO.FileS ...

  3. .net命名空间和程序集详解

    命名空间是一种用于将逻辑上相似的类按层次结构分组的机制.这种机制防止了命名冲突.在这种结构化采用被点号"."分隔的单词来实现.通常最顶层的命名空间是System,例如System; ...

  4. .NET 程序集与命名空间

    程序集 程序集(assembly)是一个或多个托管模块,以及一些资源文件的逻辑组合. 组成部分 Windows文件首部 CLR文件首部 程序集清单 类型元数据 MSIL(CIL)代码 嵌入资源集 作用 ...

  5. C#之回到了最初的起点----解决方案、项目、程序集、命名空间

    C#之回到了最初的起点----解决方案.项目.程序集.命名空间 ——Percy 初学者很容易把这些概念搞混淆.先说说项目(Project),通俗的说,一个项目可以就是你开发的一个软件.在.Net下,一 ...

  6. C# 获取命名空间对应的程序集位置

    由于同名命名空间会被多个程序集使用,C#没有提供直接的方法(对象浏览器也不行)通过命名空间获得程序集位置,这样就不方便找到那些引用文件时什么. 那么可以在立即窗口,中断某个代码的时候,去查询类所在程序 ...

  7. 编写高质量代码改善C#程序的157个建议——建议123:程序集不必与命名空间同名

    建议123:程序集不必与命名空间同名 程序集一般会和命名空间同名,但这并不是必须的.事实上,不同名的命名空间和程序集是很常见的. 程序集表示的是一种物理上的分组,而命名空间是逻辑上的分组,两者没有必然 ...

  8. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

    读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...

  9. SilverLight命名空间详解-新手入门

    1.核心命名空间 1.xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"是silverlight的核 ...

随机推荐

  1. Emrips 反质数枚举 javascript实现

    今天看到一个kata,提出一个"emirps"的概念:一个质数倒转后得到的是一个不同的质数,这个数叫做"emirps". 例如:13,17是质数,31,71也是 ...

  2. iOS 超大高清图展示策略 TileLayer 及 levelsOfDetailBias 分析

    本次分析针对当下流行的中国地图图片处理,1亿像素,就是下面这张: 原图尺寸:11935x8554 文件大小:22.1MB 原始加载方式 首先,我们尝试一下直接加载的方式,看看效果会有多恐怖 效果请看下 ...

  3. 15. 使用Apache Curator管理ZooKeeper

    Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来. 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题. ...

  4. UWP 五星好评

    var pfn = Package.Current.Id.FamilyName; await Launcher.LaunchUriAsync(new Uri("ms-windows-stor ...

  5. scapy安装及SCTP包分析

    关于Scapy scapy是一个强大的交互式数据包处理程序(使用python编写).它能够伪造或者解码大量的网络协议数据包,能够发送.捕捉.匹配请求和回复包等.它可以很容易地处理一些典型操作,比如端口 ...

  6. 两行 CSS 代码实现 PNG 任意颜色赋色技术

    很久之前在张鑫旭大大的博客看到过一篇 PNG格式小图标的CSS任意颜色赋色技术,当时惊为天人,感慨还可以这样玩,私底下也曾多次想过有没有其他方法可以实现. 本方法与上面 ZXX 的方法及流传的使用 f ...

  7. UVA12493 - Stars(求1-N与N互质的个数)欧拉函数

    Sample Input 3 4 5 18 36 360 2147483647 Sample Output 1 1 2 3 6 48 1073741823 题目链接:https://uva.onlin ...

  8. 2015级C++第4周项目 函数

    [项目1-求最大公约数] 參考解答 (1)输入两个数.并求出其最大公约数 #include <iostream> using namespace std; //自己定义函数的原型(即函数声 ...

  9. Django项目实践4 - Django网站管理(后台管理员)

    http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...

  10. Iframe简单介绍(一)

    Iframe可以用在以下几个场景 1.典型系统结构,左侧是功能树,右侧就是一些常见table或者表单之类的.为了每一个功能,单独分离出来,采用iframe. 2.AJAX上传文件 3.加载别的网站内容 ...