C#3.0亮点 —— 分部方法
分部方法那些方法原型或定义都是在分部类的声明中指定, 但是没有在该分部类的相同声明中提供方法的具体实现方法. 一般情况下, 在相同分部类中的其它任何声明中都没有对这个方法的任何实现.
如果在相同分部类的任何其它声明中都美誉这个方法的实现, 则编译器将不会为这个方法的声明, 对该方法的调用, 或者为传递到该方法参数的赋值而生成IL代码. 就好像这个方法从来都没有存在过一样.
分部方法的示例
using System; namespace LinqTest { class Program { partial class PartialClass { partial void MissionA(int missionCount); int missionCount = 0; public void SmallMission() { Console.WriteLine("Mark before MissionA"); MissionA(missionCount++); Console.WriteLine("MissionA done!"); //查看此时missionCount的值 Console.WriteLine("missionCount: " + missionCount); } } static void Main(string[] args) { PartialClass partialClass = new PartialClass(); partialClass.SmallMission(); } } }
程序结果显示missionCount的值为0, 这是因为这个分部方法没有具体实现的方法体, 编译器编译时没有生成像这个方法参数赋值的IL. 查看程序的IL代码也证实如此, 没有发现有关于MissionA方法的IL代码.
如果改一下, 将那个partial方法实现一下, 只需在代码中加上:
public partial class PartialClass { partial void MissionA(int missionCount) { Console.WriteLine("missionCount in MissionA's Value: "+ missionCount); } }
编译一下, 查看IL代码, 看到了MissionA的IL代码:
.method private hidebysig instance void MissionA(int32 missionCount) cil managed { // Code size 22 (0x16) .maxstack 8 IL_0000: ldstr "missionCount in MissionA's Value: " IL_0005: ldarg.1 IL_0006: box [mscorlib]System.Int32 IL_000b: call string [mscorlib]System.String::Concat(object, object) IL_0010: call void [mscorlib]System.Console::WriteLine(string) IL_0015: ret } // end of method PartialClass::MissionA
运行之后可以发现, missionCount这个时候打印出来, 就是1了.
为什么要用分部方法
跟分部方法比较类似的就是类和类中方法的继承, 还有虚拟(abstract)方法. 分部方法存在的目的在于, 编码者有时希望在代码文件中留下一下可以未来有机会再写的方法函数, 以后可以让其它编码者编写这些分部方法的代码, 就算是没有人实现了这些分部方法, 它也不会对性能产生丝毫的影响.
使用分部方法的规则
1. 分部方法只能在分部类中定义和实现
2. 分部方法必须制定partial修改程序
3. 分部方法是私有的, 但是不能制定private修改程序, 否者会产生编译错误
4. 分部方法必须返回void类型
5. 分部方法可以是未实现的方法
6. 分部方法可以是静态的
7. 分部方法可以有参数
作者:Create Chen
出处:http://technology.cnblogs.com
说明:文章为作者平时里的思考和练习,可能有不当之处,请博客园的园友们多提宝贵意见。
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。