许明会的计算机技术主页

Language:C,C++,.NET Framework(C#)
Thinking:Design Pattern,Algorithm,WPF,Windows Internals
Database:SQLServer,Oracle,MySQL,PostSQL
IT:MCITP,Exchange,Lync,Virtualization,CCNP

导航

论:命名空间,程序集和类

在给学员讲解命名空间,程序集和类间的关系的时候,发现普遍接受困难,于是想写一个这样的专题文章,今天终于有时间搞定.

讨论程序集、名称空间、类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个程序集。

费了一个上午的时间,看来做一个书籍作者真的很不容易呀!


posted on 2008-01-18 13:45  许明会  阅读(685)  评论(0编辑  收藏  举报