浅谈partial class的理解
第一种说法:
partial classes:局部类型
partial 类型可以使我们把对某个类的描述写在不同地方,甚至写到两个或多个不同的文件中去。partial 信息只对编译器有用,编译器在编译时看到对某个类的描述是“碎”的(partial 的),它会去其他地方收集该类的其他碎片,然后把所有的该类的碎片组合成完整的一个类,再对其编译。所以partial 体现不到编译好的 IL中去的。
第二种说法
C# 2.0 可以将类、结构或接口的定义拆分到两个或多个源文件中,在类声明前添加partial关键字即可。 例如:下面的PartialTest类 class PartialTest { string Str_FieldTest; int Int_FieldTest; public void DoTest() { Debug.Print("Test"); } } 可在不同源文件中写成下面形式: 一个文件中写: partial class PartialTest { string Str_FieldTest; int Int_FieldTest; } 另一个文件中写: partial class PartialTest { public void DoTest() { Debug.Print("Test"); } } 什么情况下使用分部类? – 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理(相当于支持并行处理,很实用); – 使用自动生成的源时,无需重新创建源文件便可将代码添加到类中。Visual Studio 在创建Windows 窗体、Web 窗体时都使用此方法。你不用编辑Visual Studio 所创建的文件,便可创建使用这些类的代码。换句话说:系统会自动创建一个文件(一般记录的是窗体及窗体中的控件的属性),另一个或几个文件记录的是用户自己编写的代码。这两部分分开可以使结构显得非常清晰,用户只需关注自己负责的那部分就行了(需要的话,这两部分可以互相调用)。等到了编辑运行的时候,系统会自动将这两部分合成一个文件。 使用Partial需要注意以下一些情况: 1. 使用partial 关键字表明可在命名空间内定义该类、结构或接口的其他部分 2. 所有部分都必须使用partial 关键字 3. 各个部分必须具有相同的可访问性,如public、private 等 4. 如果将任意部分声明为抽象的,则整个类型都被视为抽象的 5. 如果将任意部分声明为密封的,则整个类型都被视为密封的 6. 如果任意部分声明继承基类时,则整个类型都将继承该类 7. 各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口 8. 在某一分部定义中声明的任何类、结构或接口成员可供所有其他部分使用 9.嵌套类型可以是分部的,即使它们所嵌套于的类型本身并不是分部的也如此。如下所示: class Container { partial class Nested { void Test1(); } partial class Nested { void Test2(); } } 使用分布类的一些限制: 1. 要作为同一类型的各个部分的所有分部类型定义都必须使用partial 进行修饰。如下所示: public partial class A { } public class A { } // Error, must also be marked partial 2. partial 修饰符只能出现在紧靠关键字class、struct 或interface前面的位置(枚举或其它类型都不能使用partial); 3. 要成为同一类型的各个部分的所有分部类型定义都必须在同一程序集和同一模块(.exe 或.dll 文件)中进行定义。分部定义不能跨越多个模块; 4. 类名和泛型类型参数在所有的分部类型定义中都必须匹配。泛型类型可以是分部的。每个分部声明都必须以相同的顺序使用相同的参数名。 partial class扩展功能新思路 开闭原则:“对修改封闭,对扩展开放”。在面向对象的系统中,通过类的继承实现扩展。.net中提供的partial class提供了扩展类的新思路。 一、应用场景可以使用partial class的场景很多。这里分析一个ORM的例子。 二、继承方式扩展工具自动生成一个CatBase类,这个类只有属性,嵌入到ORM框架中。既然需要扩展功能,很容易想到对这个基类继承,于是有了Cat类。Cat类如愿以偿地有了Miaow()函数。 三、partial class扩展partial class简单地说就是可以将一个类的代码写到两个或多个代码文件中。编译器在编译的过程中将这几个文件组合起来一起编译。一个很酷的技术。 四、对比分析两种思路都可以实现需求。孰优孰劣需要仔细分析一下。 整体上说,使用partial class更加优雅一些。 在VS2005中,Form、DataSet都使用了partial class方式,原理和这个一样。但是要将这个原理推广到“业务实体”中,可能在理解上需要有所突破。 使用partial class确实会带来可读性的损失,尤其是一个类分布在很多个文件中的时候,所以文件的命名最好是有一个规范来保证。 |
第三种说法
.net 2.0中,有了个partial这样的关键字,最初接触它是在asp.net2.0中的codeFile中见到的。
总给人一种不爽的感觉,默认生成那样的代码。所以项目中一直并不用它,包括我接触的人当中,也鲜有人关注过它,个人觉得还是失败的,这样的一个功能点。
partial,部分之义,partial class,顾名思义为 部分类,msdn上称之为 分布类,是更贴切一些的,意思即为:一个类的一个部分。 也就是说,可分别定义该类的接口、成员等,编译器会在编译阶段将之合并成为一个类的。如下代码:
Code
查看其IL代码,即可知晓其真正的原身:
虽然这样能分开对之进行编写设计,但其自身的局限性,限制了别人对它的使用,总觉得是个幌子而已。
局限性:1、必须存在于同一个程序集(dll exe)中 2、修饰符还必须一样,如public/private/protected的,则不成 3、只能应用于class interface and struct 4、不易统一管理
总之个人觉得这就是个幌子,极其恨之,没事搞个partial来,究竟能有多少实际意义呢。。。
浅谈partial class的理解相关推荐
- web前端技术基础课程讲解之浅谈对soket的理解
浅谈对soket的理解 定义: 网络上的两个程序通过一个双向的通信链实现数据的交换,这个链接的一端就成为Socket 它是进程通信的一种,即调用这个网络库的api函数实现分布在不同主机相关进程之间的数 ...
- 浅谈Spring IOC的理解
浅谈Spring IOC的理解 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊 ...
- 【浅谈】我所理解的游戏场景设计:身临其境
今天看了一篇关于场景设计的文章,让我比较有感触,于是也想谈一谈自己对它的理解.我认为场景设计不好被单独拿出来讨论,它牵涉到游戏设计中的很多内容,下面先从"场景设计"聊起. 场景是至 ...
- 委托学习总结(一)浅谈对C#委托理解
要理解委托,我们首先要知道委托的概念: "委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Els ...
- 浅谈对xmpp的理解及应用
参考原文链接 http://blog.sina.com.cn/s/blog_69f68f880102uyeg.html 一.xmpp是基于xml的协议.具有遵循标准,有安全性,使用TCP传的xml的流 ...
- java 线程的理解_浅谈对多线程的理解(一)
今天我们先来聊聊有关线程的话题...... 一. 线程概述 1. 简单区分程序.进程和线程 程序是指一段静态的代码 进程是指正在执行的程序,将静态的代码运行起来 线程是指正在执行程序的小单元 举个栗子 ...
- 系统学习NLP(二十三)--浅谈Attention机制的理解
转自:https://zhuanlan.zhihu.com/p/35571412 Attentin机制的发家史 Attention机制最早是应用于图像领域的,九几年就被提出来的思想.随着谷歌大佬的一波 ...
- 浅谈Vue渐进式的理解
对于刚刚接触前端的我来说,理解Vue的相关问题还是要从基础的模型结构入手.对于内容会持续更正.添加...... 传统的MVC模型与MVVC模型 前端设计中的经典模型,Model View Contro ...
- 前端——CSS:浅谈对float的理解
我之前仿做百度首页,将整个页面整体布局完并写好之后,发现我的网页中的部分块会随着网页大小的变化而移位.我尝试了很多方法,调完之后,还是发现有一个块始终没有办法乖乖到我预想的位置.如下所示: div_f ...
最新文章
- Globalization Resources
- 宏基因组实战8. 分箱宏基因组binning, MqaxBin, MetaBin, VizBin
- Python中列表的copy方法
- Java学习之JDBC实现简单的CRUD(mysql数据库)
- StoryBoard之User Defined Runtime Attributes的使用
- Linux下C语言实现LCD屏幕截图
- Kubernetes-卷/存储卷(emptyDir/hostPath/pv/pvc)(十)
- 1000道Python题库系列分享十二(9道编程题)
- Python使用模块中对象的几种方法
- Python中and、or、not用法
- ipython版本_1. Python版本的选择与安装
- 二级java考什么_​Java计算机二级考试考什么
- php前台输出繁体,利用PHP输出控制功能做简繁体转换_php
- “放管服”改革背景下公安车驾管业务办理情况调研
- c# openxml Excel部分学习之路
- php表单提交并发送邮件给某个邮箱(示例源码)
- csv逗号分割不兼容 解决_excel保存为csv 不兼容的功能
- 从前慢-SpringCloud
- Unity 基于PDFViewer制作读取横板PDF,改为横向滑动读取并做自适应(可网络同步)
- linux的nfs配置文件的编写信息(学习day1)