zoukankan      html  css  js  c++  java
  • 关于“程序集与命名空间”

    不少.NET程序因为动态加载等需要反射技术,所以了解此技术显得非常重要。在此想给大伙儿逐一介绍一下:

    1)基础知识——程序集与命名空间:

    .NET中有两个最容易被忽略的东西莫过于“程序集”和“命名空间”。初学者往往容易在此地混淆,因此需要介绍一番:

    所谓“程序集”(Assembly),可以理解成一个exe或者dll程序的“签名档”——其包含了程序的版本、文件名等一系列信息。我们可以通过右键某个exe或者dll,查看此信息。例如编写了一个控制台的exe程序,右键查看属性截图如下:

    其中这些属性已经包含到了一个叫做AssemblyInfo.cs文件中(在C#中默认位置在于Properties文件夹下,VB.NET则需要点击“显示全部文件”按钮,然后从“My Project”中找到该文件)。或者您可以右键某个项目,属性之后切换到“应用程序(Application)”面板随后点击“程序集信息(Assembly Info……)”即可对程序信息进行编辑。

    不过值得注意的是最底下一行的“原始文件名”——这个映射的是你“应用程序”面板中“程序集名称”中的名称默认情况下“程序集名称”=“根命名空间”=“生成的exe或者dll”的名称,但是实际上并不对等;因此您可以修改任意一项),修改完毕以后注意以下事项:

    1)程序集名称:映射“程序集”信息中“原始文件名”。

    2)根命名空间:当右键项目创建一个cs代码文件之后自动的那个namespace名称就是此名称,反射经常需要使用“根命名空间1.根命名空间2…….根命名空间N.类”的方式寻找到指定的类进行反射其中属性或者方法,因此值得注意的是——默认的“根命名空间”也可以随意修改,和默认的那个命名空间毫无关系。

    谈到“命名空间”大伙儿可以把它理解成一个个文件夹,而每一个class相当于里边的文件;自然文件夹可以嵌套(譬如命名空间A嵌套命名空间B),除了可以写成:

    [C#]

    namespace A
    {
         namespace B
         {
         }
    }

    [VB.NET]

    NameSpace A
         NameSpace B
    
         End NameSpace
    End NameSpace

    更简单的做法可以直接用英文句号(实心点)分割父命名空间和子命名空间,譬如:
    [C#]

    namespace A.B
    {
    
    }

    [VB.NET]

    NameSpace A.B
    
    End NameSpace

    此时如果用反射工具查看就会发现“A”嵌套了一个“B”。和之前写法效果完全一致。
    同时要注意——使用Assembly.LoadFrom/File加载一个exe或者dll然后反射其方法的时候必须按照反射工具,或者你自己代码中命名空间的绝对顺序——从根目录开始遍历的方法依次用点分割写成“命名空间1.命名空间2.……命名空间N.类的形式。譬如以上的AB嵌套的命名空间中“B”嵌套了一个类C,那么直接可以在LoadForm/LoadFile(……).GetType("A.B.C").……因为A下有一个B,B下有一个C。

    一个比较特殊的情况是“根命名空间”中嵌套一个简化写法的“子命名空间”,譬如:

    [C#]

    namespace A
    {
        namespace A.B
        {
            public class MainTest
            {
                
            }
        }
    }

    [VB.NET]

    NameSpace A
    
        NameSpace A.B
    
               Public Class MainTest
    
               End Class
        
        End NameSpace
    
    End NameSpace

    或许你认为说A.B就是一个之前介绍过A中嵌套B的方式,展开后的形式为:A中又嵌套了一个A,再次嵌套了一个B(难道命名空间可以重复?!)——答案是“是的”!只要同级命名空间名字不重复,嵌套的子命名空间当然允许重复(原理与Windows资源管理器中“嵌套文件夹名称”和“父文件夹名称”可以一致!)

  • 相关阅读:
    Linux下#!/usr/bin/env bash和#!/usr/bin/bash、#!/bin/bash的比较
    重要:1. hive查询时,先看表格元数据是怎样分区的,然后在where里写分区条件,否则会查询出错;2. 在Where条件中使用变量时,Hive查询会非常慢
    001机器人姿态RPY及移动路径方式
    linux 查看并对外开放端口(防火墙拦截处理)
    协程,twisted
    flask源码走读
    python 协程与go协程的区别
    Python 自带 RPC Demo
    这样逼格满满的弹出框消息提示你不心动吗?
    JS获取本周、本季度、本月、上月的开始日期、结束日期
  • 原文地址:https://www.cnblogs.com/ServiceboyNew/p/2656824.html
Copyright © 2011-2022 走看看