C# 图解教程 第5版 —— 第22章 命名空间和程序集

文章目录

    • 22.1 引用其他程序集
    • 22.2 命名空间
      • 22.2.1 命名空间名称
      • 22.2.2 命名空间的补充
      • 22.2.3 命名空间跨文件伸展
      • 22.2.4 嵌套命名空间
    • 22.3 using 指令
      • 22.3.1 using 命名空间指令
      • 22.3.2 using 别名指令
      • 22.3.3 using static 指令
    • 22.4 程序集的结构
    • 22.5 程序集标识符
    • 22.6 强命名程序集(*)
    • 22.7 私有程序集的部署(*)
    • 22.8 共享程序集和 GAC(*)
    • 22.9 配置文件(*)
    • 22.10 延迟签名(*)

22.1 引用其他程序集

​ 在许多项目中,会使用其他程序集的类或类型,而不仅仅是自己声明的。这些程序集(称为类库)可能来自 BCL 或第三方供应商,也可以是自己创建的。通常这些程序集文件的名称以 .dll 扩展名结尾,而不是 .exe。

image-20240112104716131 image-20240112104630330
图22.1 SuperLib 源代码和结果程序集

​ 假设还要写一个名为 MyWidgets 的程序,而且想使用 SquareWidget 类。在代码中没有声明类 SquareWidget,使用的是定义在 SuperLib 中的类。在编译程序时,需要给编译器添加该引用。

image-20240112104937515

​ 在 Rider 中,右键项目,选择“添加” -> “引用”,选择下方的“添加自”按钮,找到对应的程序集即可。

image-20240112105453161 image-20240112105603092
图22.2 Rider 中添加程序集

​ 添加引用后,即可编译 MyWidgets。

image-20240112105753187
图22.3 引用另一个程序集

mscorlib 库

​ 有一个类库,几乎先前的每个示例中都使用了它,即包含 Console 类的类库。该类库被定义在 mscorlib 程序集中的 mscorlib.dll 文件里。mscorlib 包含 C# 类型及大部分 .NET 语言基本类型的定义,在编译时,它必须被引用,因此不显示放在引用目录中。

​ 因此,算上 mscorlib,图 22.3 的过程看起来更像是图 22.4 描述的那样。

image-20240112110057102
图22.4 引用类库

潜在的问题

​ 若想扩展上述类的能力,使用名为 CircleWidget 的类,并将其定义在 UltraLib 的程序集中。MyWidgets 的源代码如下,创建一个 SquareWidget 对象和一个 CircleWidget 对象,分别定义在 SuperLib 和 UltraLib 中。

image-20240112110502799

​ 类库 UltraLib 的源代码如下所示,并将 UltraLib 编译成 dll,加入到项目引用列表中。注意,除了 CircleWidget 类外,还声明了一个名为 SquareWidget 的类。

image-20240112110702481

​ 由于两个库都含有名为 SquareWidget 的类,编译时会产生错误信息,因为编译器不知道使用 SquareWidget 类的哪个版本。

image-20240112111012114
图22.5 由于程序集 SuperLib 和 UltraLib 都含有名为 SquareWidget 的类声明,编译器不知道该实例化哪一个

22.2 命名空间

  • 命名空间可视为一个字符串,加在类名或类型名前面,通过点分隔。
  • 命名空间名、分隔点、类名三者共同组成类的完全限定名
  • 命名空间是共享命名空间名的一组类和类型。
image-20240112151644643
图22.6 命名空间是共享同一命名空间名的一组类型定义

​ 使用命名空间将一组类型组织在一起并命名。

image-20240112151816672

​ 例如,创建 MyCorp.SuperLib 命名空间并在其中声明 SquareWidget 类。

image-20240112152123128

​ 当 MyCorp 公司提供更新的程序集时,可以按照如下方式修改。

image-20240112152209194

​ 如果 UltraLib 程序集也被使用,那么编译过程下。

image-20240112152254624
图22.7 带命名空间的类库

22.2.1 命名空间名称

  • 命名空间名称可以是任何有效标识符,区分大小写。
  • 命名空间名称可以包含任意数量的句点符号,用于将层次化组织类型。
表22.1 来自 BCL 的命名空间示例
image-20240112152501201

​ 使用命名空间要点如下:

  1. 以公司名称开头。
  2. 在公司名之后跟着技术名称。
  3. 不要与类或类型名称相同。

22.2.2 命名空间的补充

  • 命名空间内,每个类型名必须有别于所有其他类型。
  • 命名空间内的类型称为命名空间的成员。
  • 源文件可以包含任意树木的命名空间声明,可以顺序也可以嵌套。
image-20240112152744401
图22.8 一个源文件中的多个命名空间

22.2.3 命名空间跨文件伸展

​ 命名空间是非封闭的,可以在源文件后面或其他源文件中使用。

image-20240112152909337 image-20240112153030894
图22.9 命名空间可以跨源文件并编译成单个程序集

22.2.4 嵌套命名空间

  1. 文本嵌套

    将命名空间的声明放在一个命名空间声明体内部。

  2. 分离的声明

    为嵌套命名空间创建单独的声明,但必须在声明中使用完全限定名。

image-20240112153510335 image-20240112153558282
图22.10 声明嵌套命名空间的两种形式是等价的

22.3 using 指令

​ using 指令包含 2 大作用:

  1. using 命名空间指令。
  2. using 别名指令。

​ 关于 using 指令的要点如下:

  • 必须放在源文件的顶端,在任何类型声明之前。
  • 应用于当前源文件中的所有命名空间。

22.3.1 using 命名空间指令

​ 通过在源文件顶端放置 using 命名空间指令以避免使用长名称。

image-20240112154615000

​ 下面的代码使用 using 命名空间指令来描述该代码来自 System 命名空间的类或其他类型。

image-20240112154634804

22.3.2 using 别名指令

image-20240112154913312

​ using 别名指令允许起一个别名给:

  1. 命名空间。
  2. 命名空间捏的一个类型。
image-20240112155352194
  • 前两行告诉编译器,Syst 是 命名空间 System 的别名,SC 是类 System.Consle 的别名。
  • Main 的第一条语句使用命名空间 System 的别名,第二条语句使用完全限定名,第三条语句使用类的别名。

22.3.3 using static 指令

​ 使用 using static 指令引用给定命名空间中的特定类、结构体或枚举,以不带任何前缀地进行访问。

image-20240112155555697

​ using static 指令指定的类本身可以不是静态的,类中非静态类型成员不会被 using static 指令导入。

22.4 程序集的结构

​ 程序集本身不包含本地机器代码,而是包含公共中间语言代码。此外,还包含即时编译器(JIT),在运行时将 CIL 转换为本机代码所需要的一切信息。程序集的文件扩展名通常为 .exe 或 .dll。

单文件程序集

​ 大部分程序集由一个单独的文件构成:

  1. 程序集清单。

    • 程序集标识符。
    • 组成程序集的文件列表。
    • 一个指示程序集中内容在哪里的地图。
    • 关于引用的其他程序集的信息。
  2. 类型元数据。

    包含程序集中定义的所有类型的信息。

  3. CIL 中间代码。

  4. 资源部分。

    该部分可选。可以包含图形或语言资源。

image-20240112161415922
图22.11 单文件程序集的结构

多文件程序集

​ 程序集代码文件称为模块。尽管大部分程序集由单个文件构成,但有些程序集含有多个文件。对于有多个模块的程序集,一个文件是主模块,其他为次要模块。

  • 主模块含有程序集的清单和次要模块的引用。
  • 次要模块的文件名以扩展名 .netmodule 结尾。
  • 多文件程序集被视为一个单元,一起部署并一起定版。
image-20240112161836105
图22.12 多文件程序集

22.5 程序集标识符

​ 在 .NET 框架中,程序集的文件名相对不重要,更重要的是程序集的标识符,其包含 4 个组成部分:

  1. 简单名称。

    不带文件扩展名的文件名,也称为程序集名友好名称

  2. 版本号。

    形式为 MajorVersion.MinorVersion.Build.Revision,例如:2.0.35.9。

  3. 文化信息。

    一个由 2 ~ 5 个字符组成的字符串,代表一种语言、国家或地区。例如,没过使用的英语文化名是 en-US,德国使用的德语文化是de-DE。

  4. 公钥。

    由程序集公司生产的唯一字符串(128 字节)。

image-20240112162522780
图22.13 清单中程序集标识符的组成部分
image-20240112162552644
图22.14 关于程序集标识符的术语

22.6 强命名程序集(*)

22.7 私有程序集的部署(*)

22.8 共享程序集和 GAC(*)

22.9 配置文件(*)

22.10 延迟签名(*)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/410412.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣刷MySQL-第二弹(详细解析)

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:力扣刷题讲解-MySQL 🍹文章作者技术和水平很有限,如果文中出…

java SECS管理系统 将逐步推出 SECS 客户端(Passive) 管理系统 SECS快速开发平台 springboot secs开发平台

SECS管理系统 这是一套SECS客户端(Passive),可以直接连接PLC设备,支持Modbus、三菱MC、欧姆龙Fine、OPC-UA、西门子S7设备等通信。 企业已经有了EAP软件,但是设备没有SECS通信功能,这时候可以使用这套框架,直接连接设备&#xff…

基本BGP配置试验 :配置 IBGP 和 EBGP

一、预习: BGP:Border Gateway Protocol 没有精妙的算法,但能承载大量的路由,它不生产路由,它是路由的搬运工 使用TCP做为传输层协议,端口号179,使用触发式路由更新 1. BGP路由…

MATLAB Deep learning

文章目录 Chapter 1: Machine Learning存在的问题过拟合Overfitting解决过拟合 regularization and validationregularization 正则化validation 验证 机器学习的类型有监督学习分类Classification回归Regression 无监督学习聚类 强化学习 Chapter 2: Neural Network神经网络的…

【iOS】数据存储方式总结(持久化)沙盒结构

在iOS开发中,我们经常性地需要存储一些状态和数据,比如用户对于App的相关设置、需要在本地缓存的数据等等,本篇文章将介绍六个主要的数据存储方式 iOS中数据存储方式(数据持久化) 根据要存储的数据大小、存储数据以及…

cookie和session的工作过程和作用:弥补http无状态的不足

cookie是客户端浏览器保存服务端数据的一种机制。当通过浏览器去访问服务端时,服务端可以把状态数据以key-value的形式写入到cookie中,存储到浏览器。浏览器下次去服务服务端时,就可以把这些状态数据携带给服务器端,服务器端可以根…

LaWGPT安装和使用教程的复现版本【细节满满】

文章目录 前言一、下载和部署1.1 下载1.2 环境安装1.3 模型推理 总结 前言 LaWGPT 是一系列基于中文法律知识的开源大语言模型。该系列模型在通用中文基座模型(如 Chinese-LLaMA、ChatGLM等)的基础上扩充法律领域专有词表、大规模中文法律语料预训练&am…

【Linux进程篇】进程地址空间(2)

【Linux进程篇】进程地址空间(2) 目录 【Linux进程篇】进程地址空间(2)进程地址空间的再次理解什么是虚拟地址?fPIC与地址无关码是什么?为什么动态库里有,静态库里没有呢? 作者&…

高考志愿填报系统开发技术语言选择总结

开发高考志愿填报系统,需要考虑到系统的稳定性、安全性、易用性以及数据准确性。以下是针对高考志愿填报系统的技术方案选择建议: 1.后端技术:可以使用Python、Java、PHP等后端语言进行开发,考虑到易用性和开发效率,可…

银行数据仓库体系实践(2)--系统架构

UML对系统架构的定义是:系统的组织结构,包括系统分解的组成部分,它们的关联性,交互,机制和指导原则,例如对系统群就是定义各子系统的功能和职责,如贷款系统群可能分为进件申请、核额、交易账务、…

C++力扣题目669--修剪二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。…

iOS UI掉帧和卡顿优化解决方案记录

UI卡顿原理 在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行…