频道直达:新闻 - 组网 - 安全 - 服务器 - 存储 - 系统 - 应用 - 开发 - 数据库 - 前沿 - 技术人 - 培训 - 求职 - 读书 - 教程 - 专题 - 产品 - 案例 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

C# 3.0中的分部方法(1)

作者: 佚名 出处:中国IT实验室 2007-08-07 09:45    砖    好    评论   进入论坛
阅读提示:本文简单介绍了C# 3.0中的分部方法的基础知识,供大家了解!

分部方法的语法

在看C#语言的What's New时,突然发现新特性列表的最后,多出了一个“Partial Method Definitions”,但并不像其他新特性一样有超链接链接到其说明。上网搜索了一下,关于分部类型的信息非常少。尤其是中文信息,英文技术文章中,倒是有两篇不错的:http://blogs.msdn.com/wesdyer/archive/2007/05/23/in-case-you-haven-t-heard.aspxhttp://community.bartdesmet.net/blogs/bart/archive/2007/07/28/c-3-0-partial -methods-what-why-and-how.aspx。

又仔细看了一下MSDN Library for Visual Studio 2008 Beta 2,终于对这个语言特性有所了解,在这里介绍一下,希望对大家有所帮助。

分部方法的定义和分部类型类似,只需在方法定义前添加partial关键字。但分部方法只能拆分成两个部分——一部分是定义声明(Definition Declaration),另一部分是实现声明(Implement Declaration)。其中定义声明看上去和抽象方法类似:

partial class CA
{
// ……
private void partial M(); // 定义声明|
而实现声明看上去和普通方法类似:
private void partial M() // 实现声明
{
// 方法体
}

在调用分部方法时,和调用其他方法一样:

CA a = new CA();
a.M();

只是,如果只有定义声明而没有编写实现声明,则编译器不会发射(Emit)该方法和调用该方法的语句的元数据与IL代码。换言之,如果没有编写实现声明,则编译得到的程序集中,CA类型里并没有M这个方法。

使用分部方法的注意事项

分部方法的语法非常简单,但有一些事项要注意。

如果没有写实现声明,则不会发射方法调用代码,也不会对参数进行求值。因此,对于下面的例子:

class CA
{
partial void M(int i);
static void Main()
{
CA a = new CA();
int i = 0;
a.M(i++);
}
}

分部方法M只有定义声明,没有实现声明,因此也不会发射调用该方法的代码:a.M(i++),因此也不会对i++进行求值。所以最终i的值依然是0.但如果为M编写了实现声明,则a.M(i++)的代码会被编译到最终的程序集中,同时参数也被求值,i的值将被变为1。

分部方法只能出现在分部类中。

分部方法必须是私有(private)的,并且返回值类型必须是void。

分部方法可以带有参数,并且其参数可以带有this、params和ref修饰符,但不能带有out修饰符。

分部方法不可以是虚拟(virtual)的。

分部方法不可以是外部(extern)的。

分部方法可以是静态(static)的,也可以是不安全(unsafe)的。

分部方法可以是泛型方法,泛型约束必须放置在定义声明中,但也可以在事先声明中重复说明。在定义声明和实现声明中,类型参数和类型参数的名字不一定必须一致。

不能将分部方法封装到一个委托中。

分部方法的应用场景

分部方法和分部类型的初衷是类似的,一方面可以使得不同的开发者能够同时编写一个类型的不同部分,另一方面可以分离自动生成的代码和用户手写的代码。和分部类型一样,分部方法也会在编译初期被合并成一个方法定义。猜测:从微软的角度来看,第二个“初衷”可能才是真正的初衷。

由此,分部方法有如下几个应用场景:(场景1 出自In Case You Haven't Heard这篇文章「http://blogs.msdn.com/wesdyer/archive/2007/05/23/in-case-you- haven-t-heard.aspx),场景2出自Visual Studio 2008的Linq to SQL技术,而场景3则是Anders Liu自已臆想出来的。

场景1:轻量级事件处理

有的时候,自动生成的代码需要事件这类语言构造来通知用户对某些操作进行处理,但实际上用于编写的代码就位于自动生成的类型之中。此时,或者需要触发一个事件,或者就需要生成一个virtual方法来让用户继承。但无论是事件还是继承,开销都是比较大的,所以可以通过分部方法来实现轻量级的处理方式。如下面的类:(本例子引用自前述的In Case You Haven't Heard一文)。

partial class Customer
{
string name;
public string Name
{
get
{
return name;
}
set

OnBeforeUpdateName();
OnUpdateName();
name = value;
OnAfterUpdateName();
}
}
partial void OnBeforeUpdateName();
partial void OnAfterUpdateName();
partial void OnUpdateName();
}

这里定义了三个分部方法,其意义不言而喻。假设这是系统自动生成的代码,则我们只需在另外一个源代码文件中的partial class Customer中实现这几个分部方法即可。


共2页: 1 [2] 下一页
【内容导航】
关于 分部  方法  C#
专题
C#实用基础教程
C#技术开发指南
初探敏捷开发
WCF开发基础
体验Visual Studio 2008的魅力
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看81024次)
·UML类图详解 (查看72498次)
·C++是垃圾语言?! (查看42631次)
·C#技术开发指南 (查看40232次)
·UML统一建模语言 (查看39205次)
·Java编程开发手册 (1198个砖)
·Java基础教程 (431个砖)
·C#技术开发指南 (311个砖)
·.NET开发手册 (254个砖)
·PB开发教程 (223个砖)
·Java编程开发手册 (658个好)
·Java基础教程 (578个好)
·.NET开发手册 (282个好)
·PB开发教程 (213个好)
·Delphi开发技术手册 (200个好)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。