第一种说法:

partial classes:局部类型

partial 类型可以使我们把对某个类的描述写在不同地方,甚至写到两个或多个不同的文件中去。partial 信息只对编译器有用,编译器在编译时看到对某个类的描述是“碎”的(partial 的),它会去其他地方收集该类的其他碎片,然后把所有的该类的碎片组合成完整的一个类,再对其编译。所以partial 体现不到编译好的 IL中去的。

第二种说法

C#中的partial class(部分类)
2008-12-05 19:59

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的例子。
系统中有一个Cat类,属性ID、Age、Weight都需要存储到数据库中,一个信息系统中常见的需求。通过读取数据库的结构,可以用工具生成Cat类的代码。并且ORM框架支持了从数据库信息生成Cat对象。
现在的Cat什么动作都没有,客户说,我们需要一个Miaow()的函数。这时就需要对ORM生成的Cat类进行扩展了。
可以肯定地一点是,我们不能修改自动生成的代码,因为这会牵涉到数据库结构与代码同步的问题。解决这个需求有两种方法:继承方式扩展,partial class扩展。

二、继承方式扩展

工具自动生成一个CatBase类,这个类只有属性,嵌入到ORM框架中。既然需要扩展功能,很容易想到对这个基类继承,于是有了Cat类。Cat类如愿以偿地有了Miaow()函数。
以前系统中用的是CatBase的实例,现在创建CatBase实例的地方需要改为创建Cat的实例。这个问题让ORM框架解决吧。
客户的需求实现了,我们自己的代码生成也没有遭到破坏,任务完成。

三、partial class扩展

partial class简单地说就是可以将一个类的代码写到两个或多个代码文件中。编译器在编译的过程中将这几个文件组合起来一起编译。一个很酷的技术。
工具生成的Cat类仍然不变。既然需要增加函数,那么在新建一个代码文件,将Miaow()函数写出来就可以。需要做的仅仅是将类的声明由class改为partial class,任务完成。

四、对比分析

两种思路都可以实现需求。孰优孰劣需要仔细分析一下。
实例创建:partial class更加简洁。
系统复杂度:对于系统来说,partial class方式下只存在一个类,而继承方式有两个类。
继承逻辑:从逻辑上讲,Cat并不需要一个基类CatBase,这样做仅仅是因为在代码构建过程中的一个限制。
维护性:两种方式下都会存在两个代码文件,维护成本并没有区别。
可读性:两个Cat文件确实让人费解。

整体上说,使用partial class更加优雅一些。
“继承”的这种方式比较符合传统的思维习惯,而partial class到底是不是满足开闭原则呢,这点确实不好说。不过在软件构建上,我是一个实用主义者,哪种方式好用就用哪一种。
在ORM的场景中,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的理解相关推荐

  1. web前端技术基础课程讲解之浅谈对soket的理解

    浅谈对soket的理解 定义: 网络上的两个程序通过一个双向的通信链实现数据的交换,这个链接的一端就成为Socket 它是进程通信的一种,即调用这个网络库的api函数实现分布在不同主机相关进程之间的数 ...

  2. 浅谈Spring IOC的理解

    浅谈Spring IOC的理解 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊 ...

  3. 【浅谈】我所理解的游戏场景设计:身临其境

    今天看了一篇关于场景设计的文章,让我比较有感触,于是也想谈一谈自己对它的理解.我认为场景设计不好被单独拿出来讨论,它牵涉到游戏设计中的很多内容,下面先从"场景设计"聊起. 场景是至 ...

  4. 委托学习总结(一)浅谈对C#委托理解

    要理解委托,我们首先要知道委托的概念: "委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Els ...

  5. 浅谈对xmpp的理解及应用

    参考原文链接 http://blog.sina.com.cn/s/blog_69f68f880102uyeg.html 一.xmpp是基于xml的协议.具有遵循标准,有安全性,使用TCP传的xml的流 ...

  6. java 线程的理解_浅谈对多线程的理解(一)

    今天我们先来聊聊有关线程的话题...... 一. 线程概述 1. 简单区分程序.进程和线程 程序是指一段静态的代码 进程是指正在执行的程序,将静态的代码运行起来 线程是指正在执行程序的小单元 举个栗子 ...

  7. 系统学习NLP(二十三)--浅谈Attention机制的理解

    转自:https://zhuanlan.zhihu.com/p/35571412 Attentin机制的发家史 Attention机制最早是应用于图像领域的,九几年就被提出来的思想.随着谷歌大佬的一波 ...

  8. 浅谈Vue渐进式的理解

    对于刚刚接触前端的我来说,理解Vue的相关问题还是要从基础的模型结构入手.对于内容会持续更正.添加...... 传统的MVC模型与MVVC模型 前端设计中的经典模型,Model View Contro ...

  9. 前端——CSS:浅谈对float的理解

    我之前仿做百度首页,将整个页面整体布局完并写好之后,发现我的网页中的部分块会随着网页大小的变化而移位.我尝试了很多方法,调完之后,还是发现有一个块始终没有办法乖乖到我预想的位置.如下所示: div_f ...

最新文章

  1. Globalization Resources
  2. 宏基因组实战8. 分箱宏基因组binning, MqaxBin, MetaBin, VizBin
  3. Python中列表的copy方法
  4. Java学习之JDBC实现简单的CRUD(mysql数据库)
  5. StoryBoard之User Defined Runtime Attributes的使用
  6. Linux下C语言实现LCD屏幕截图
  7. Kubernetes-卷/存储卷(emptyDir/hostPath/pv/pvc)(十)
  8. 1000道Python题库系列分享十二(9道编程题)
  9. Python使用模块中对象的几种方法
  10. Python中and、or、not用法
  11. ipython版本_1. Python版本的选择与安装
  12. 二级java考什么_​Java计算机二级考试考什么
  13. php前台输出繁体,利用PHP输出控制功能做简繁体转换_php
  14. “放管服”改革背景下公安车驾管业务办理情况调研
  15. c# openxml Excel部分学习之路
  16. php表单提交并发送邮件给某个邮箱(示例源码)
  17. csv逗号分割不兼容 解决_excel保存为csv 不兼容的功能
  18. 从前慢-SpringCloud
  19. Unity 基于PDFViewer制作读取横板PDF,改为横向滑动读取并做自适应(可网络同步)
  20. linux的nfs配置文件的编写信息(学习day1)

热门文章

  1. 《C#零基础入门之百识百例》(九)位和赋值运算符 -- 2的n次幂
  2. 【AI测试】人工智能测试整体介绍——第四部分
  3. 薛兆丰经济学讲义 | 第2章 成本
  4. 对于大数据的发展,主要划分为哪几大阶段?
  5. 苹果EMS物流管理系统
  6. 哲学家就餐问题的三种避免死锁的解法(PV操作)
  7. 排序-JAVA实现【四】堆排序
  8. 白盒测试——NextDate函数测试(基本路径覆盖法)
  9. 欺骗的艺术 --- 第一章
  10. JAVA前端与后端交互面试题