




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
西南林学院计算机与信息科学系周开来 第二讲C NET应用程序的组织 从物理层面的组织从逻辑层面的组织 从物理层面的组织 工程项目 本地文件 远程文件 用户程序文件 系统文件 资源文件 第三方程序 1 cs 2 cs 3 cs dll exe dll exe 图象文件 文档文件 项目描述文件 配置文件描述文件 Solution解决方案 Project项目 VS NET使用解决方案和项目来组织和管理应用程序的文件 解决方案是应用程序的基础 项目是构建块 Solution Project WhenaWebsiteiscreated asolutionfile sln andahiddensolutionuseroptionsfile suo arecreated VisualStudio NET采用两种文件类型 sln和 suo 来存储特定于解决方案的设置 它们总称为解决方案文件 Solution Project sln VisualStudio Solution 通过为环境提供对项目 项目项和解决方案项在磁盘上位置的引用 可将它们组织到解决方案中 suo是solutionuseroption的缩写 它是很重要的文件 它储存了用户界面的自定义配置 包括布局 断点和项目最后编译的而又没有关掉的文件 下次打开时用 等 以便于下一次你打开VisualStudio可以恢复这些设置 因此不要随便删除也无法删除 况且它们就是隐藏文件 所以不要管它们 解决方案Solution 一个逻辑上的容器 包含构成应用程序的项目和其他文件 一个解决方案中可以包含一个或多个项目 除了项目外 解决方案还包含其他独立于项目的文件 可分为两类 一类是解决方案中多个项目共享的文件 它们将被生成到应用程序中 另一类是杂项文件 它们不生成到应用程序中 仅仅被解决方案引用而不属于解决方案 项目Project 由文件组成 它的输出结果通常为可执行文件 exe 或动态链接库 dll 所有的项目都包含在解决方案中 并且含有一个唯一的项目文件 sln 其中含有对应项目所包含文件的列表以及它们的跟踪信息 每次保存项目都将更新项目文件 可以通过VS NET提供的项目模板来创建新的项目 Project项目 csproj文件是C 项目文件的扩展名 它是 CSharpProject 的缩写 VisualStudio NET会根据csproj里的XML定义来管理项目文件以及相关其他一些种类非常丰富的数据及操作 项目的类别 C 中主要有三种项目类别 本地项目 Web项目和智能设备项目 本地项目的组成文件位于开发计算机上 Web项目的组成文件位于Web服务器或本地文件系统上 智能设备项目主要开发基于手机 PDA掌上电脑等移动设备的程序开发 下表列出了用户所能创建的项目类型 在VS NET中它们通过项目模板实现 除了表中给出的项目类别 VS NET还有另外两个应用程序模板 空项目和空Web项目 它们创建一个空的应用程序 用户可以向其中添加相应的项 C 项目的类型 常见项目文件扩展名 cs类文件 源代码都写在这里 resx资源文件 一些资源存放在这里 一般不需要看 csprojC 项目文件 用VS打开这个文件就可以直接打开这个项目 自动生成 csproj user是一个配置文件 自动生成的 会记录项目生成路径 项目启动程序等信息 Designer cs设计文件 自动生成 如果你是Winform项目的话 主要就是这些文件了 如果是WebForm的话 还有 aspx是网页文件 HTML代码写在这里面 AssemblyInfo cs文件这个文件用来设置项目的一些属性 在创建项目时 可以查看赋给项目的属性 并且可以使用自定义属性向项目中添加信息自定义属性有两组第一组属性包括4个字段 Title Description和Configuration及5个有关公司或产品的自定义属性 Trademark Copyright Product Company和Culture 这些属性在System Reflection命名空间中使用8个类来表示 第二组属性在System Runtime CompilerSevices命名空间中 是一些可以添加到代码中的自定义属性 并且这些信息在生成项目时添加到可执行文件中 下面是摘自AssemblyInfo cs的程序代码 可以从中体会属性的是使用方法 使用命名空间usingSystem Reflection usingSystem Runtime CompilerServices usingSystem Runtime InteropServices 下面是第一组属性 有关程序集的一般信息使用下面的一族属性进行控制 改变这些属性的值可以改变和程序集相关的信息 assembly AssemblyTitle Hello 标题 assembly AssemblyDescription 程序集的描述信息 assembly AssemblyConfiguration 生成配置信息 assembly AssemblyCompany xyyy 公司信息 assembly AssemblyProduct Hello 产品信息 程序集的版本信息由下面两个部分组成 主版本号和文件版本号 assembly AssemblyVersion 1 0 0 0 assembly AssemblyFileVersion 1 0 0 0 示例 创建一个Console项目程序 使用VS NET提供的项目模板创建一个控制台应用程序 它将在DOS窗口中显示 HelloWorld 字符串 首先选择 文件 新建 项目 命令打开新建项目对话框 如图 在左边的项目类型中选择VisualC 选项 在右边的模板列表中选择控制台应用程序选项 在名称文本框中输入你的项目名 并且在位置文本框中指定项目文件希望保存的目录位置 本例中项目名称为Hello 项目保存在C C 2005中 最后单击确定按钮 VS NET将自动生成应用代码 我们在生成代码的Main方法中添加一行代码 以显示 HelloWorld Console WriteLine HelloWorld 下面查看 解决方案资源管理器 窗口的内容 如图 解决方案名称为Hello 只包含一个项目Hello 这个项目下面包含两个文件 AssemblyInfo cs和Program cs 另外在References文件夹中包含这个项目所引用的组件 在使用某个类型时 需要把实现这些类型的组件添加到项目的References文件夹中 程序创建完成 这是个很简单的程序 添加引用 在 NET框架中 可用类型都被打包成程序集 这是 NET应用程序和组件进行版本控制和部署的单元 最简单的程序集就是一个单独的exe或者dll模块 其中只包含一个类型 在使用类型前 必须添加对该类型程序集的引用 在命令行中 使用 reference或是 r可以添加对相应程序集的引用 csc reference system xml dll HelloWorld cs 在VS NET环境中添加引用右键单击 解决方案资源管理器 中的 引用 图标 选择快捷菜单中 添加引用 命令 将显示添加引用对话框 NET 标签中包含了全局程序集中的全部可用组件 选择 按钮将选定组件 在下方的框体中显示 使用浏览按钮可以选择一个私有程序集 项目 标签可以添加对已有项目的引用 使用MSDN文档获取某个 NET框架类型所属的程序集 程序结构的分析 Program cs文件包含了程序所定义的类Program 其中包含了程序的入口方法Main 在自动生成的代码中 类的定义位于一个命名空间中 在本例中就是类Program位于命名空间Hello中 这是因为在 NET框架中使用命名空间来对类型进行逻辑分组 如果其他应用程序要使用本例所创建的类Program 可以通过Hello Program来引用 在程序的开始部分使用usingSystem 语句指出本程序要使用System命名空间中所包含的类型 本例中使用的Console类型就在该命名空间中 程序结构小结 所有C 程序具有与Hello例子类似的结构首先 程序定义了一个命名空间Hello 本程序定义的所有类型都位于这个命名空间中 一个程序可以定义多个命名空间 一个命名空间中可以包含多个类型 但一个类型只能位于一个命名空间中 不同命名空间中相同名字的类型被认为完全不同的类型 其次 程序定义了一个类Program 它实现了程序的功能 较复杂的程序可能会定义许多类型 但必须要有一个类型包含Main静态方法来提供程序运行的入口 本例中使用位于System命名空间的Console类型中的WriteLine方法来向DOS窗口输出字符串 所以要使用usingSystem语句指明要引用的命名空间 复杂的程序可能会使用多个命名空间中的许多类型 需要使用using语句一一指定 所有程序项目都有一个对应的AssemblyInfo cs文件 可以在这个文件中指定项目的一些属性 生成并运行程序 选择 生成 生成解决方案 命令 编译器将开始编译 链接程序 并最终生成可执行文件 在此过程中 会打开一个输出窗口显示生成过程中遇到的错误和警告信息 如图 生成过程若出错 VS NET将打开错误列表窗口 在其中列出遇到的每个错误 双击某个错误项可以直接跳转到对应的代码行 如图 如果没有错误 编译器将生成可执行文件 在VS NET中可以采用两种方式运行程序 调试运行 选择 调试 启动调试 或点击工具栏 启动按钮 或是直接按F5键 直接运行 选择 调试 开始执行 或是按Ctrl F5键 生成的文件 为一个HelloWorld解决方案生成的文件分两类定义该解决方案和项目的文件HelloWorld suo 隐藏的二进制文件 包含有解决方案的当前用户设置 HelloWorld sln 文本文件 包含解决方案的相关信息 HelloWorld csproj 定义VisualC 项目的XML文件 HelloWorld csproj user XML文件 包含用户特定的项目信息 用于编译以生成项目程序集的源文件源文件因所用项目模板类型而异 VisualC 项目都含一个AssemblyInfo cs文件 源程序文件与程序集文件的关系 一个程序集文件通常是一个 EXE或 DLL一个程序集文件通常由若干个 CS结尾的源程序文件编译 链接而成例如 1 编译多个源文件 将其合并为一个程序集Csc out Main exe1 cs2 cs3 cs 2 创建和使用代码库将 cs和 cs放入单独的代码库中Csc t Library out user dll2 cs3 csCsc out Main exe r user dll1 cs 从逻辑层面的组织 按名称空间 System UserSpace 项目 Coreclasses types Windows Data IO NET Forms 表示层名称空间 业务层名称空间 数据层名称空间 Form类 Control类 C 中的名称空间 作用 C 采用名称空间 namespace 来组织程序 它既可以用作程序内部的组织 类与类之间 也可以用作外部程序的组织 程序与程序之间 将对象逻辑地连接在一起防止二义性与防止名称冲突它类似Java中的包名 为什么要引入名称空间 目的 通过使用名称空间可以将相关类或结构等放在同一个名称空间中 这样既有效地组织了程序代码 同时又可以避免同名类或结构等的相互冲突 原因 因为在 Net框架中定义了大量的类 结构 而且在一大型程序中也定义出许多类 名称空间的编程特性 名称空间可以被看作为一个成员容器 其成员只能是类 结构 接口 枚举和代表 名称空间可以嵌套 采用层次结构 即在名称空间中包含其他名称空间 名称空间的层次关系类似文件夹的层次关系 定义名称空间 定义 namespace名称空间名 其成员为类 结构 接口 枚举和代表等的定义 种类 全局名称空间 没有定义在其它名称空间内的名称空间 嵌套的名称空间 在其它名称空间内的名称空间 namespace名称空间名 全局名称空间 namespace名称空间名1 嵌套的名称空间 其成员为类 结构 接口 枚举和代表等的定义 要点 名称空间也可以采用完整的名称进行嵌套定义 引用某一名称空间内的类 带有完整的名称的对象定义难以阅privateSystem Windows Forms MenuItemNewMenuItem 通过using语句来简化代码usingSystem Windows Forms MenuItemNewMenuItem 为一个名称空间或类型导入别名usingwinForm System Windows Forms winForm MenuItemNewMenuItem 名称空间编程要点 要引用某一名称空间 则应该在声明其它的类型前引用 usingSystem 程序开头为类型引用namespaceYour nsname usingSystem Xml 其它一些内容 应该放在using之后 别名只在它所在的单元中可以使用 而在其它单元中不可以使用 using语句中只能包含名称空间名 不能有类名 usingN1 N2 A 错误 因为A是类名 类和对象的概念 具体产品 蓝图与产品的关系抽象与具体的关系Class Object 抽象蓝图 类 Classes 类定义了一个 模板 通过这个 模板 可以生成一个或多个对象类定义了一个对象的 状态 和 行为 classStudent 学生类 intNo 学号stringName 姓名floatScore 成绩publicintenrollment 注册 取得学号 实现代码 publicfloatexamine 考试 修改成绩 实现代码 属性字段 描述状态 行为方法 修改状态 二 类的声明 类的声明就是定义一个新类 其格式如下 属性 类修饰符 partial class标识符 基类 类的定义体 1 类声明包含一组可选的属性 C 使程序员可以创造新的说明性信息种类 称为属性 2 一组可选的类修饰符 public protected internal private abstract sealed 类的声明 3 Partial是2 0版新增加的一个关键字 表明该类只是一个局部类 引入局部类后 就可以将一个大类划分成若干个小局部类 分属于不同的 CS文件中 但都必须属于同一个名称空间 4 关键字class和一个名称该类的标识符 5 接着是一个可选的继承基类 最后是可根据需要后接一个分号的类体 实例化 Instantiation 实例化就是创建对象的过程使用new关键字来创建 publicclassStudent privatestaticintGlobalNo 2004070601 publicintNo 学号publicstringName 姓名publicfloatScore 成绩publicintEnrollment 注册 取得学号 this No GlobalNo publicfloatExamine 考试 修改成绩 this Score newRandom No Next 0 101 StudentS1 S1 newStudent S1 Name 张飞 S1 Enrollment S1 Examine StudentS2 S2 newStudent S2 Name 关羽 S2 Enrollment S2 Examine 学生类 对象1 对象2 对象vs 对象引用 对象存储在内存堆中 是系统开辟的一片连续存储空间对象变量保存的仅仅是对象的一个引用地址 不是对象本身 StudentS S newStudent S newStudent 张飞200407060178 关羽200407060289 类的成员 在最简单的设计中 我们定义两种类的成员 属性 用于描述 状态 保持 状态 方法 用于定义行为 publicclassBankCustomer publicstringName fields attributespublicDateTimeOperatorDate publicdecimalBalance publicvoidDeposit decimalamount methods this Balance amount 一个类可包含下列成员的声明 构造函数 实现初始化类的实例所需要的操作析构函数 实现在永久性放弃类的实例之前要执行的操作常数 表示与类相关联的常数值 字段 类的变量 方法 实现可由类执行的计算和操作 属性 定义与读取和写入这些特性相关的名称特性 索引器 允许以与索引数组相同的方式索引类的实例运算符 定义可以应用于类的实例的表达式运算符事件 定义可由类生成的通知委托 也称代理 是指对一个方法的匿名调用嵌套类型 在类或结构内部定义的类型称为嵌套类型 类的数据成员 常量成员定义 常量修饰符 const数据类型常量名 表达式例 Publicconstfloatpi 3 14156f classClassMain staticvoidMain string args Console Write x 0 B x classA publicconstintvar1 10 var2 20 classB publicconstintx A var1 A var2 补充 只读字段与常量字段 publicstaticreadonlydoublePrice 3 72只读字段和常量字段的相同点 一旦被赋值 都不允许被再次修改只读字段可以在声明时被赋值 同时可以在类的构造函数中被赋值 或者根本不赋值常量只能在声明的时候被初始化 并且必须是可计算出具体值的表达式常量只能是内建类型 int float string 不能是引用型 只读字段可以使用任何类型 变量成员 定义 Class类名 属性 变量修饰符 数据类型变量名 表达式 例如 privateintNo 2004070601 publicfloatArea 3 14f 2 5f 2 5f staticstringName SWFC StudentS1 newStudent 类方法成员 方法的结构格式如下 属性 修饰符 返回值类型方法名 参数 语句体 注 方法的访问控制修饰符请见P65页表3 2 3 3方法如有返回值 则需使用return语句 如没有返回值 则需声明为void方法的参数传递有值参数 引用参数 输出参数和数组参数四种形式 详见书P67 74 usingSystem classAppStart staticvoidMain string args BankCustomerBC1 newBankCustomer BC1 Name 张三 Console WriteLine BC1 Name 存入 BC1 Deposit 1500 ToString C partialclassBankCustomer publicstringName 客户姓名publicintbalance 存款余额publicintDeposit intnum balance num returnbalance 2 方法参数 1 值参数未用任何修饰符声明的参数为值参数 2 引用参数用ref修饰符声明的参数为引用参数 在方法中对引用参数的任何更改都会反映给实参 3 输出参数用out修饰符声明的参数称为输出参数 如果希望函数返回多个值 可使用输出参数 4 参数数组 用params修饰符声明的变量称为参数数组 它允许向函数传递个数变化的参数 例 使用值参数usingSystem classTestValue staticvoidSwap inta intb intt t a a b b t staticvoidMain intx 10 y 20 Console WriteLine x 0 y 1 x y Swap x y Console WriteLine x 0 y 1 x y 例 使用引用参数usingSystem classTestValue staticvoidSwap refinta refintb intt t a a b b t staticvoidMain intx 10 y 20 Console WriteLine x 0 y 1 x y Swap refx refy Console WriteLine x 0 y 1 x y 例 使用输出参数usingSystem classTestOut staticintOutMultiValue inta outcharb b char a return0 staticvoidMain intt 65 r charm r OutMultiValue t outm Console WriteLine r 0 m 1 r m 例 使用参数数组usingSystem classTestParams staticvoidMutiParams paramsint var for inti 0 i var Length i Console WriteLine var 0 1 i var i staticvoidMain int arr 10 20 30 MutiParams arr 有3个参数 参数为一维数组MutiParams 100 200 有2个参数MutiParams 没有参数 静态 static 类成员 静态 static 中的成员不属于任何对象它可以通过类名直接访问实例成员必须通过建立对象的引用来访问 publicclassMath publicconstdoublePI 3 14159 constantsareimplicitlystaticpublicstaticdoublePow doublex doubley computeareaofcircle area Math PI Math Pow radius 2 0 何时来使用static 需要全局数据和代码的时候 publicclassBankCustomer publicstaticfloatinterest 银行利率 不针对某一个客户publicdecimalbalance 帐面余额 publicstaticvoidTraceMsg stringmsg if Globals Trace arewetracing Ifso writemsg 静态方法 在类中 与实例方法相对应的是静态方法 在定义类的方法成员时带上Static修饰符 就可以将方法定义为静态方法 另外注意 定义一个静态方法时 不能含有virtual abstract 和override修饰符 静态方法与静态成员变量类似 虽然在类中定义它 但他不属于某个具体的实例 静态方法只能访问类中的静态成员 而实例方法可以访问类中的所有成员 publicclassstudent staticintstudcount 0 定义一个私有的静态变量成员 用于统计学生人数publicstudent studcount 统计学生人数 publicstaticintGetStudentCount 定义一个静态方法 return studcount 静态方法访问静态成员变量 classAppStud publicstaticvoidMain studentstudent1 newstudent 创建类的一个实例Console WriteLine 学生人数 0 student GetStudentCount 通过类名访问静态方法studentstudent2 newstudent 创建类的另一个实例Console WriteLine 学生人数 0 student GetStudentCount publicclasstestStatic intx staticinty publicvoidmethod1 x 10 1 y 20 2 publicstaticvoidmethod2 x 10 3 y 20 4 publicstaticvoidMain testStaticapp newtestStatic app x 10 5 app y 20 6 testStatic y 20 7 testStatic x 10 8 请指出左边程序中 编号 1 8 中 哪些是正确的调用 哪些是错误的调用 publicclasstestStatic intx 定义实例变量成员staticinty 定义静态变量成员publicvoidmethod1 定义实例方法 x 10 正确 等价于this x 10 y 20 正确 等价于testStatic y 20 publicstaticvoidmethod2 定义静态方法 x 10 错误 静态方法无法访问非静态变量成员 即不能访问this xy 20 正确 静态方法可以访问静态变量成员 即等价于Test y 20 publicstaticvoidMain testStaticapp newtestStatic 创建类的实例app x 10 正确 通过实例访问实例变量成员app y 20 错误 类的实例不能访问静态变量成员 应改用类型名来因引用testStatic y 20 正确 可以通过类名来访问静态成员testStatic x 10 错误 不能通过类名来访问实例变量成员 补充知识 在C 2 0中可以用static来修饰类 在1 0和1 1版本不可以 当类中的字段和方法都是Static时 可以用static来修饰类 如 PublicstaticclassA则A中的成员都是静态的 如果A被修饰成为Static时 不能用new来实例化A 构造函数和析构函数 构造函数用于为对象分配空间 完成初始化工作 构造函数特殊性表现在 构造函数的名字必须与类名相同 构造函数可以带参数 但没有返回值 构造函数在对象定义时被自动调用 如果没有给类定义构造函数 则编译系统会自动生成一个缺省的构造函数 其形式如下 publiccon base 构造函数可以被重载 但不可以被继承 实例构造函数用于创建和初始化实例 创建新对象时要调用实例构造函数 其格式为 访问修饰符类名 形参列表 函数体 静态构造函数用于初始化静态数据 或用于执行仅需执行一次的特定操作 在创建第一个实例或引用任何静态成员之前 将自动调用静态构造函数 其格式为 static类名 函数体 析构函数主要用于释放类实例 析构函数特殊性表现在 析构函数的名字与类名相同 但它前面加一个 符号 析构函数不能够带参数 也没有返回值 当撤销对象时 自动调用析构函数 析构函数不能被继承 也不能被重载 例 使用构造函数和析构函数usingSystem classComplex doubleimag real publicComplex 无参数构造函数 有两个参数的构造函数publicComplex doubler doublei imag i real r Complex 析构函数 this关键字 this关键字引用类的当前实例 成员通过this关键字可以知道自己属于哪一个实例 this关键字是一个隐含引用 它隐含于每个类的成员函数中 this的常用用途 限定被相似的名称隐藏的成员将对象作为参数传递到其他方法声明索引器 4 方法重载 它允许一个类中有同名的方法存在为了区分这些同名方法 要求方法有不同的参数 要么参数个数不同 要么参数类型不同 例 使用方法重载usingSystem classTestMethod intsquare intx returnx x doublesquare doublex returnx x decimalsquare decimalx returnx x staticvoidMain TestMethodt newTestMethod Console WriteLine Thesqureis 0 1 2 t square 10 t square 12 34 t square 123 456m 5 运算符重载 运算符重载可以对C 中已有的运算符赋予新的功能 其格式为 publicstatic返回值类型operatorunary operator 参数列表 方法体 重载Point类的 和 运算符usingSystem classPoint privateintx y publicPoint inta intb x a y b publicstaticPointoperator Pointp p x p y returnp publicvoidDisplay Console WriteLine Point x 0 Point y 1 x y publicstaticPointoperator Pointp1 Pointp2 Pointp newPoint 0 0 p x p1 x p2 x p y p1 y p2 y returnp staticvoidMain string args Pointa newPoint 10 20 Pointb newPoint 30 40 a a b a Display a a Display 2 属性 属性用于刻画对象的特征或表示对象的状态 它提供对类或对象性质的访问 其格式为 访问修饰符数据类型属性名 get get访问器代码块 set set访问器代码块 set访问器 给属性赋值 它使用value设置属性的值get访问器 获取属性值 它通过return返回属性的值 如果只有get访问器 表示是只读属性 如果只有set访问器 表示只写属性 如果既有get访
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年智慧城市行业数字孪生城市模型研究报告
- 2025年新媒体行业媒体营销与内容创作研究报告
- 2025年绿色能源行业市场潜力及投资机会分析报告
- 2025年软件开发行业软件应用开发与软件工程研究报告
- 2025年可再生能源行业太阳能电池技术创新研究报告
- 2025年新零售行业线上线下融合模式研究报告
- 2025年文化传媒行业全民阅读推动战略研究报告
- 2025年医药健康产业行业传统中医药现代化发展报告
- 2025重庆云阳县消防救援局政府专职消防员招聘16人笔试模拟试题及答案解析
- 2025秋季中国石油高校毕业生招聘笔试模拟试题及答案解析
- 拍照摄影技巧
- 校园招聘服务协议书范本
- 语音厅运营基础知识培训
- AIGC艺术设计 课件全套 第1-8章 艺术设计的新语境:AI的介入 -AIGC艺术设计的思考与展望
- 广州市房屋租赁合同国土局标准模版
- 停车场保安安全知识培训课件
- 校长在食堂从业人员培训会上的讲话
- (高清版)DBJ∕T 13-91-2025 《福建省房屋市政工程安全风险分级管控与隐患排查治理标准》
- 雅思小作文教学课件
- 电气柜安装服务合同范本
- 2025至2030中国硅单晶生长炉行业项目调研及市场前景预测评估报告
评论
0/150
提交评论