当前位置: 首页 > news >正文

利用partial关键字声明分部类和分部方法

一、分部类

1、分部类的定义:简单的说,分部类就是把一个类拆分成多个类,每个类文件只包含其中的一部分,类、结构、接口、方法都可以拆分,在定义的时候加上partial修饰符。

注意:分部类必须属于同一命名空间。类名必须相同。

2、分部类的应用:

  • 分部类对于代码生成或修改工具来说意义重大。使用分部类,这些工具操作的文件可以独立于开发者正在人工编码的文件。

  例如:假如一个代码生成工具能根据数据库中的Person表为Person类生成对应的Person.Designer.cs文件。这个工具将检查表的内容,并为表中的每一列都创建属性。问题在于,这个工具经常都不能生成一些必要的验证逻辑,因为这些验证逻辑要依赖于没有嵌入数据库表定义的业务规则。在这种情况下,Person类的开发者需要自己添加验证逻辑。Person.Designer.cs是不好直接修改的,因为假如文件被重新生成(例如,为了适应数据库中新增的一个列而重新生成文件),所做的更改就会丢失。在这种情况下,Person类的代码结构应独立出来,是生成的代码在一个文件中,定制的代码(带有业务规则)则在另一个文件中。后者不受任何重新生成动作的影响。

  • 将每个嵌套类都放到他们自己的文件中。这是为了与编程规范”将每个类定义都放到它自己的文件中“保持一致。

注意:分部类不允许对编译好的类(其他程序集中的类)进行扩展。只能利用分部类在同一个程序集中经一个类的实现分解到多个文件中。

二、分部方法

  • 分部方法只能存在于分部类中,必须加上partial,不能有访问修饰符,因此是隐式私有的。其主旨是为了代码的生成提供方便。
  • 分部方法允许声明一个方法而不需要一个实现。如果包含了可选的实现,这个实现可以放到某个姊妹分部类的定义中(可能在一个单独的文件中)。
  • 分部方法使程序能调用未实现的方法,而不会发生编译错误。如果程序中未提供分部方法的实现,则编译器会自动移除方法签名,以及所有对该方法的调用。也就是说,如果没有为一个分部方法提供实现,CIL中不会出现分部方法的任何踪迹。这样,在保持代码尽量小的同时,还保持了高地灵活性。
  • 分部方法的返回值类型必须是void。原因:如果不是返回null,同时没有提供实现,那么调用一个未实现的方法,返回什么才合理呢?为了避免对返回值进行任何无端的猜测,c#的设计者决定只允许方法返回void。类似的,out参数在分部方法中是不允许的。如果需要一个返回值,可以使用ref参数。

三、局部类型

1.局部类型适用于以下情况:

(1) 类型特别大,不宜放在一个文件中实现。
(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
(3) 需要多人合作编写一个类

2. 局部类型的限制

(1) 局部类型只适用于类、接口、结构,不支持委托和枚举。
(2) 同一个类型的各个部分必须都有修饰符 partial。
(3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
(4) 一个类型的各个部分必须被同时编译。

 

3. 局部类型的注意点

(1) 关键字partial是一个上下文关键字,只有和 class、struct、interface 放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。
(2) 局部类型的各个部分一般是分开放在几个不同的.cs文件中,但C#编译器允许我们将他们放在同一文件中。

4. 局部类型的应用特性

在局部类型上的特性具有“累加”效应。

 

[Attribute1, Attribute2("Hello")]
partial class Class1{}

[Attribute3, Attribute2("Exit")]
partial class Class1{}

 


相当于

 

[Attribute1, Attribute2("Hello"), Attribute3, Attribute2("Exit")]
class Class1 {}

 


注:Attribute2属性允许在类上多次使用。

5. 局部类型上的修饰符

(1) 一个类型的各个部分上的访问修饰符必须维持一致性。
(2) 如果一个类型有一个部分使用了abstract修饰符,那么整个类都将被视为抽象类。
(3) 如果一个类型有一个部分使用了 sealed 修饰符,那么整个类都将被视为密封类。
(4) 一个类的各个部分不能使用相互矛盾的修饰符,比如不能在一个部分上使用abstract,又在另一个部分上使用sealed。

6. 局部类型的基类和接口

(1) 一个类型的各个部分上指定的基类必须一致。某个部分可以不指定基类,但如果指定,则必须相同。
(2) 局部类型上的接口具有“累加”效应。

 

partial class Class2: Iinterface1, Iinterface2 {}
partial class Class2: Iinterface3 {}
partial class Class2: Iinterface2 {}

 


相当于

 

class Class2: Iinterface1, Iinterface2, Iinterface3 {}

 

转载于:https://www.cnblogs.com/BrokenIce/p/5120144.html

相关文章:

  • linux下搭建LAMP
  • 整洁的测试遵循的规则
  • server配置学习 ---- 关闭防火墙
  • 第一章 C++编程基础
  • DataBind()方法实现数据绑定
  • Qt 和 Boost关于信号和槽的对比说明
  • APT典型应用示例
  • 20160119--进销存系统分析
  • Swift教程之typealias代替OC的typedef
  • 安装XAMPP
  • ubuntu15.10安装 jdk
  • 属性与字段的区别
  • 使用OGGquot;Loading data from file to Replicatquot;的方法应该注意的问题:replicat进程是前台进程...
  • java 单例模式总结
  • MAC下配置OpenCV的具体方法(2016年最新)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • download使用浅析
  • Facebook AccountKit 接入的坑点
  • js学习笔记
  • React Native移动开发实战-3-实现页面间的数据传递
  • TypeScript迭代器
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 百度地图API标注+时间轴组件
  • 基于webpack 的 vue 多页架构
  • 使用SAX解析XML
  • 树莓派 - 使用须知
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • scrapy中间件源码分析及常用中间件大全
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # 透过事物看本质的能力怎么培养?
  • #stm32整理(一)flash读写
  • #vue3 实现前端下载excel文件模板功能
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)Linux——Linux常用指令
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (十六)一篇文章学会Java的常用API
  • (一一四)第九章编程练习
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .bat文件调用java类的main方法
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net 垃圾回收机制原理(二)
  • .NET业务框架的构建
  • .net中生成excel后调整宽度
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [codeforces]Levko and Permutation
  • [IDF]被改错的密码