在给学员讲解命名空间,程序集和类间的关系的时候,发现普遍接受困难,于是想写一个这样的专题文章,今天终于有时间搞定.
讨论程序集、名称空间、类3者间的关系
程序集:可以理解为你看到的exe文件和dll文件,每个独立的文件都是一个程序集。
名称空间:为了解决类太多的时候导致的命名冲突问题,我们会把一些类放到同一个名称下面,这个名称就叫名称空间。
类必须在某单个名称空间里面.
尽管.net2.0引入了局部类(partial),因为csc编译时程序集不带partial类相关的信息,类还是必须属于单一程序集,且单一名称空间。
也就是说:partial是语法层面的,不是CLR的一部分!
类可以通过名称空间整理存储,引入partial关键字的.net2.0解决了类必须在一个cs文件内实现的诟病.
1.
一个程序集可以包含多个名称空间,简单的实现就是在一个cs文件里面包含多个namespace定义,如下代码

/**//*--===------------------------------------------===---
作者:许明会
日期:2008年1月18日 11:14:46
目的:在多个cs文件内实现单一namespace; 测试partiall 类.
尽管局部类可以在多个cs文件内,但这些cs文件必须编译为一个程序集

单程序集编译方法如下,你将获得3个类,其中ClassInSeperateAssembly类内有2个方法.
csc /t:library /out:OneAssemblyFromSeperateCs.dll OneNamespace_MoreCs01.cs OneNamespace_MoreCs.cs
--===------------------------------------------===---*/
using System;

namespace xumh//我们将在1个cs文件内实现多个namespace


{
//在程序集01内实现的完整类
public class ClassInCs01

{
public void Display()

{
Console.WriteLine("名称空间:xumh\t类:ClassInCs01");
}
}

//在程序集内实现的局部类,会有2个方法
public partial class ParialClass

{
public void Display01()

{
Console.WriteLine("名称空间:xumh\t类:ParialClass\t方法:Display01");
}
}
}

namespace sunwp


{
public class NoUse

{
public void Display()

{
Console.WriteLine("在同一cs文件,同一Assembly内实现的多个namespace");
}
}
}

/**//*--===------------------------------------------===---
作者:许明会
日期:2008年1月18日 11:14:46
目的:在多个cs文件内实现单一namespace; 测试partial 类.
尽管局部类可以在多个cs文件内,但这些cs文件必须编译为一个程序集

单程序集编译方法如下,你将获得3个类,其中ClassInSeperateAssembly类内有2个方法.
csc /t:library /out:OneAssemblyFromSeperateCs.dll
OneNamespace_MoreCs01.cs OneNamespace_MoreCs02.cs
--===------------------------------------------===---*/
using System;

namespace xumh


{
//在程序集01内实现的完整类
public class ClassInCs02

{
public void Display()

{
Console.WriteLine("名称空间:xumh\t类:ClassInCs02");
}
}

//在程序集内实现的局部类:2个方法
public partial class ParialClass

{
public void Display02()

{
Console.WriteLine("名称空间:xumh\t类:ParialClass\t方法:Display02");
}
}
}

/**//*--===------------------------------------------===---
作者:许明会
日期:2008年1月18日 11:14:46
目的:在多个cs文件内实现单一namespace; 测试partial 类.
尽管局部类)可以在多个cs文件内,但这些cs文件必须编译为一个程序集

但程序集时的编译方法:
csc /r:OneAssemblyFromSeperateCs.dll OneNamespace_MoreCs_APP.cs
--===------------------------------------------===---*/
using System;
using xumh;

namespace TestNameSpace_xumh


{
public class runMyApp

{
static void Main()

{
ClassInCs01 c1 = new ClassInCs01();
ClassInCs02 c2 = new ClassInCs02();

ParialClass p = new ParialClass();
c1.Display();
c2.Display();
p.Display01();
p.Display02();
}
}
}
2.
一个名称空间也可以包含在多个程序集内,简单的实现就是在多个cs文件内部,有相同的namespace定义,如下代码

/**//*--===------------------------------------------===---
作者:许明会
日期:2008年1月18日 11:14:46
目的:每个cs文件作为一个程序集,通过namespace管理他们
尽管局部类可以在多个cs文件内,但这些cs文件必须编译为一个程序集

编译方法如下,你将获得2个命名空间,其中xumh空间内有2个类
csc /t:library OneNamespace_MoreAssembly01.cs
--===------------------------------------------===---*/
using System;

namespace xumh//我们将在多个Assembly里面实现同一个名称空间xumh


{
//在程序集01内实现的完整类,尽管在不同的程序集内,但xumh空间内都可以调用
public class ClassInAssembly01

{
public void Display()

{
Console.WriteLine("名称空间:xumh\t类:ClassInAssembly01");
}
}
}

//同一cs文件实现不同的namespace
namespace sunwp


{
public class NoUse

{
public void Display()

{
Console.WriteLine("在同一cs文件,同一Assembly内实现的多个namespace");
}
}
}

/**//*--===------------------------------------------===---
作者:许明会
日期:2008年1月18日 11:14:46
目的:每个cs文件作为一个程序集,通过namespace管理他们
尽管局部类可以在多个cs文件内,但这些cs文件必须编译为一个程序集

编译方法如下,你将获得2个命名空间,其中xumh空间内有2个类
csc /t:library OneNamespace_MoreAssembly02.cs
--===------------------------------------------===---*/
using System;

namespace xumh//我们将在多个Assembly里面实现同一个名称空间xumh


{
//在程序集01内实现的完整类
public class ClassInAssembly02

{
public void Display()

{
Console.WriteLine("名称空间:xumh\t类:ClassInAssembly02");
}
}
}

/**//*--===------------------------------------------===---
作者:许明会
日期:2008年1月18日 11:14:46
目的:在多个cs文件内实现单一namespace; 测试partial 类.
尽管局部类)可以在多个cs文件内,但这些cs文件必须编译为一个程序集

但程序集时的编译方法:
csc /r:OneNamespace_MoreAssembly01.dll,OneNamespace_MoreAssembly02.dll OneNamespace_MoreAssembly_APP.cs
--===------------------------------------------===---*/
using System;
using xumh;

namespace TestNameSpace_xumh


{
public class runMyApp

{
static void Main()

{
ClassInAssembly01 a1 = new ClassInAssembly01();
ClassInAssembly02 a2 = new ClassInAssembly02();

a1.Display();
a2.Display();
Console.WriteLine("hello,world.");
}
}
}
3.类,必须在某单个名称空间里面。net1.1类必须在一个文件内实现,故必然在1个程序集内实现,必然在1个名称空间内实现。
尽管.net2.0引入了局部类(partial),使得1个类可在多个cs文件内实现,但因为程序集不含有局部类的元数据信息,一样必须将多个cs编译为1个程序集。
费了一个上午的时间,看来做一个书籍作者真的很不容易呀!