C#Partial Classes
来源:互联网 发布:学校网络舆情监控制度 编辑:程序博客网 时间:2024/04/20 14:11
The article comes from the following addr: http://blog.sina.com.cn/s/blog_4aa25f130100esoe.html
It is pretty clear and readable. Forward just for notes in case the author delete it.^^
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");
}
}
什么情况下使用分部类?
–
–
使用Partial需要注意以下一些情况:
1.
2.
3.
4.
5.
6.
7.
8.
9.嵌套类型可以是分部的,即使它们所嵌套于的类型本身并不是分部的也如此。如下所示:
class Container
{
partial class Nested
{
void Test1();
}
partial class Nested
{
void Test2();
}
}
使用分布类的一些限制:
1.
public partial class A { }
public class A { } // Error, must also be marked partial
2. partial 修饰符只能出现在紧靠关键字class、struct 或interface前面的位置(枚举或其它类型都不能使用partial);
3. 要成为同一类型的各个部分的所有分部类型定义都必须在同一程序集和同一模块(.exe 或.dll 文件)中进行定义。分部定义不能跨越多个模块;
4. 类名和泛型类型参数在所有的分部类型定义中都必须匹配。泛型类型可以是分部的。每个分部声明都必须以相同的顺序使用相同的参数名。
------------------------------------------------------------------------------------------------------------------------------------------
开闭原则:“对修改封闭,对扩展开放”。在面向对象的系统中,通过类的继承实现扩展。.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确实会带来可读性的损失,尤其是一个类分布在很多个文件中的时候,所以文件的命名最好是有一个规范来保证。
- C#Partial Classes
- Partial Classes and Methods
- partial classes(局部类型)
- asp.net分部类(Partial Classes)
- .Net 2.0分部类(Partial Classes)
- Partial Classes and Methods (C# Programming Guide)
- C#partial关键字
- 12c partial index
- c#partial 关键字示例
- c#partial关键字用法
- partial关键字的作用[C#]
- C#,Partial关键字的作用
- Abstract Classes (C++)
- C Storage Classes
- Objective-C Runtime Classes
- partial
- partial
- partial
- 栈之括号匹配问题
- String,StringBuffer与StringBuilder的区别
- Liferay on Private Site to get Public Site Page URL
- Java 学习个人笔记(二)(March 19,2013 )
- JSP页面显示乱码解决方案
- C#Partial Classes
- winform控件验证技术
- 图像处理就业(转)-----本人研究生正攻读本方向,不得不看看
- collision detect--SDL lib
- 2013开始
- 第五章Oracle恢复内部原理(实例恢复)
- jQuery 入门教程(22): jQuery UI Accordion示例
- DB2第一步 — 创建表
- Uva-11992-Fast Matrix Operations