zoukankan      html  css  js  c++  java
  • 论:命名空间,程序集和类

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

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

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


  • 相关阅读:
    图片验证码, 登录, 注销, 修改密码
    注册页面及注册功能实现
    高级配置文件, csrf, django settings源码, django auth模块, 文件配置的插拔式设计
    cookie操作, session操作, django中间件
    半自动创建多对多关系表, forms组件
    sweetalert, bulk_create, 分页器
    orm查询优化, MVC与MTV, choices参数, ajax
    聚合查询, 分组查询, F与Q查询, 常见字段及参数, 自定义Char字段, 事务操作
    Contest2058
    ACM版《孔乙己》
  • 原文地址:https://www.cnblogs.com/flaaash/p/1044313.html
Copyright © 2011-2022 走看看