C#3.0亮点 —— 分部方法
分部方法那些方法原型或定义都是在分部类的声明中指定, 但是没有在该分部类的相同声明中提供方法的具体实现方法. 一般情况下, 在相同分部类中的其它任何声明中都没有对这个方法的任何实现.
如果在相同分部类的任何其它声明中都美誉这个方法的实现, 则编译器将不会为这个方法的声明, 对该方法的调用, 或者为传递到该方法参数的赋值而生成IL代码. 就好像这个方法从来都没有存在过一样.
分部方法的示例
00 using System;
01
02 namespace LinqTest
03 {
04 class Program
05 {
06 partial class PartialClass
07 {
08 partial void MissionA(int missionCount);
09 int missionCount = 0;
10 public void SmallMission()
11 {
12 Console.WriteLine("Mark before MissionA");
13 MissionA(missionCount++);
14 Console.WriteLine("MissionA done!");
15 //查看此时missionCount的值
16 Console.WriteLine("missionCount: " + missionCount);
17 }
18 }
19 static void Main(string[] args)
20 {
21 PartialClass partialClass = new PartialClass();
22 partialClass.SmallMission();
23 }
24 }
25 }
程序结果显示missionCount的值为0, 这是因为这个分部方法没有具体实现的方法体, 编译器编译时没有生成像这个方法参数赋值的IL. 查看程序的IL代码也证实如此, 没有发现有关于MissionA方法的IL代码.
如果改一下, 将那个partial方法实现一下, 只需在代码中加上:
0 public partial class PartialClass
1 {
2 partial void MissionA(int missionCount)
3 {
4 Console.WriteLine("missionCount in MissionA's Value: "+ missionCount);
5 }
6 }
编译一下, 查看IL代码, 看到了MissionA的IL代码:
00 .method private hidebysig instance void MissionA(int32 missionCount) cil managed
01 {
02 // Code size 22 (0x16)
03 .maxstack 8
04 IL_0000: ldstr "missionCount in MissionA's Value: "
05 IL_0005: ldarg.1
06 IL_0006: box [mscorlib]System.Int32
07 IL_000b: call string [mscorlib]System.String::Concat(object,
08 object)
09 IL_0010: call void [mscorlib]System.Console::WriteLine(string)
10 IL_0015: ret
11 } // end of method PartialClass::MissionA
运行之后可以发现, missionCount这个时候打印出来, 就是1了.