2-13 自动实现属性
圣殿祭司的ASP.NET4.0专家技术手册
回顾C# 2.0,当时发明了部分类(Partial Class)的机制,也就是将原本一个类定义分割成几个单位,根据需求将它们分散到不同的 .cs类文件中,而在编译时,编译程序会将原本分散的部分整合成一个类。
例如有一个“ExampleClass”类,其中包含了10个Methods,通过Partial Class可以将10个方法拆成10个类文件ExampleClassFile1.cs、ExampleClassFile2.cs,一直到ExampleClassFile10.cs,而每个类文件中包含一个方法:
文件一:ExampleClassFile1.cs:
public partial class ExampleClass
{
public void Method1()
{
…
}
}
文件二:ExampleClassFile2.cs:
public partial class ExampleClass
{
public void Method2()
{
…
}
}
文件三:ExampleClassFile10.cs:
public partial class ExampleClass
{
public void Method10()
{
…
}
}
那部分类就可以在一般情况下直接使用,详细程序可以参考PartialClassExample.aspx范例程序:
ExampleClass myExampleClass = new ExampleClass();
Response.Write(myExampleClass.Method10());
现在C# 3.0持续强化这类的功能,进一步推出了部分方法(Partial Method),在概念上与部分类是一样的,只不过它是针对单一方法进行切割,将原本单一方法分割成两个部分:①部分方法定义,②部分方法实现,再进一步将这两个部分分散到不同的.cs实体文件中。
部分方法一定要在部分类中声明,且①部分方法定义,②部分方法必须属于同一个部分类。
范例2-15 部分方法的建立与应用
在此将以部分方法实现读取Employees数据,并以GridView显示员工基本数据,步骤如下:
建立部分类文件
建立两个部分类文件PartialMethodDS1.cs及PartialMethodDS2cs。
文件一:PartialMethodDS1.cs:
请注意两点,第1个是部分方法只能用在partial class中声明,第2个是两个partial class之类名称要“完全相同”,否则会产生错误。
建立部分方法定义与实现
部分方法的定义将声明在PartialMethodDS1.cs中,实现部分将放在PartialMethodDS2.cs中,而方法的名称为getEmpData,通过它来读取员工基本数据。
文件一:PartialMethodDS1.cs的getEmpData定义:
文件二:PartialMethodDS2.cs的getEmpData实现:
程序说明
部分方法在声明上,修饰词必须使用partial关键字。
部分方法本身隐含限制就是private,不对类外部公开,如果你强加public声明,编译时会产生错误。
部分方法不可以有返回值,因此声明必须是partial void。
调用使用部分方法
部分方法的两大限制会让您感到不便,其一是隐含为private,不对外公开,但各位想想,我们在类中建立方法,目的就是要让外界可以调用,若不对外公开,则实用性何在?其二是不可以有返回值,但实际上我们常通过方法来返回string、int或DataSet等对象,不可以有返回值,使用上会限制住。故本步骤的重心在于:①打破部分方法不对外公开;②不可以有返回值的两大限制,俗话说:“有法有破、山不转路转。”解决方法为:①另外建立一个公开方法,让它以公开形式被外界调用;②既然部分方法不可以有返回值,那就传入一个对象引用当参数(传址),而从部分方法结束返回后,则这个对象就有我们需要的数据了,以下在PartialMethodDS1.cs中加入getEmployees方法:
以GridView显示员工数据
最后在PartialMethod.aspx中加入下列程序,显示员工基本数据:
protected void Page_Load(object sender, EventArgs e)
{
gvEmployees.DataSource = new PartialMethodDS().getEmployees();
gvEmployees.DataBind();
}
2-14-1 部分方法的用意
其实会编写部分方法并没有什么了不起,各位想想,若真的只是要读取员工基本数据,又何必使用部分方法这么不直觉、拐弯抹角的方式呢?这简直就是绕了一大圈做相同的事,所以,我们才需要了解部分方法创造的目的,以下为说明。
(1)部分方法在程序产生器(Code Generator)的情境下十分有用,因为部分方法分为定义及实现两部分,而最基本的只需要先定义,而不必实现,所以程序产生器可以先进行部分方法的定义,然后在程序中直接就调用方法定义(虽然还没实现),而这是完整的程序结构,那实际的定义可以稍后交给程序员再实现,每家公司或项目有不同的实现,例如,你的员工基本数据可能是在Access、SQL Server、Oracle、MySQL等,所以稍后再进行不同的实现是有必要的。
(2)针对上面所述,你还可以进行多方面的启发联想,假设你是架构师、PM或资深程序员,你只要负责定义方法,然后虽然实现部分程序还没写也没关系,你的程序仍可以一路上调用getEmployees()方法也没问题,那实现部分等你完成了整个程序的主干后,再交由同一个Team的资浅程序员来编写,这样是不是很有利分工呢?如果你不放心将程序从头到尾交给一个新手来写的话,这样的作法反而会比较好。
(3)同上面的概念,你在外包程序前,可以花费少许时间先将程序骨干设计好,只进行部分方法定义,而实现就是招标委托,让外包的公司或人员将部分方法实现部分完成,然后回到你手上的程序代码,至少架构上会符合你想要的,连方法名称都是当初定义好的,而不会被乱命名,故最后的程序不会偏离当初规划的精神,也不致于程序代码被乱写或架构乱弄,故质量可得到一定程度保障。
2-14-2 部分方法的特性与限制
部分方法在设计与使用上比部分类有更多的限制,倘若真有意使用部分方法的设计,对其特性与限制要特别注意。
部分方法限制只能存在以partial关键字声明的对象中,例如,partial class、struct或interface里。
不可有返回值(void),若需要有返回数据,变通方式是使用参考类型对象当成参数传入部分方法中,或者是部分方法的参数前使用ref关键字声明,但不可以是out传出参数。
部分方法隐含为private,故不会向外界公开成方法,也无法强加public声明使其改变既定的private限制。
部分方法可以使用static及unsafe修饰词。
部分方法可以使用泛型(generic)。
不能建立委托(delegate)到部分方法。
不可在部分方法上使用extern声明外部实现,因为部分方法的实现必须按照既定的方式。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。