《CLR Via C# 第3版》笔记之(九) - 扩展方法和分部方法
主要内容:
- 扩展方法
- 分部方法
1. 扩展方法
C#中的扩展方法实现起来非常简单,园子里也有很多写的很好的介绍扩展方法的文章。
这里就不在举例说明扩展方法了,只记录一下在实现扩展方法时应注意的原则和规则。
1)C#目前只支持扩展方法,不支持扩展属性,扩展事件等
2)扩展方法必须在非泛型的静态类中声明
3)定义扩展方法的静态类必须有文件作用域,即不能嵌套在某个类中
4)多个静态类中如果包含相同的扩展方法,编译时出错(error CS0121)
5)用扩展方法扩展了一个类型的同时,也扩展此类型的派生类型
6)扩展方法有潜在的版本控制问题。
原因:类型在调用方法时,总是先找类型本身定义的方法,如果没找到对应的方法,再去找静态类中的扩展方法。
如果类型升级后也包含了现有的扩展方法,那么现有的代码就调用不到扩展方法了。
2. 分部方法
C#中的分部方法有点类似与C/C++中的头文件(.h)和实现文件(.c或.cpp)。但是限制更多。
利用分部方法,可以将方法的声明和实现分开在两个文件中。而且声明文件中声明的方法可以没有实现部分。
我觉得分部方法可以应用在以下场景:
将工具生成的代码和开发人员生成的代码分开,如工具生成声明文件,开发人员根据具体情况来写代码文件中的实现。
这样,工具重新生成声明文件时,开发人员的代码文件不受影响。
下面用个简单的例子来说明分部方法如何使用:
CLRviaCSharp_9_def.cs为声明文件
namespace Test9 { public partial class CLRviaCSharp_9 { private string myName; public string MyName { get { ToUpperWhenGetName(); return myName; } set { myName = value; } } partial void ToUpperWhenGetName(); } }
CLRviaCSharp_9.cs为实现文件
using System; namespace Test9 { public partial class CLRviaCSharp_9 { partial void ToUpperWhenGetName() { myName = myName.ToUpper(); } static void Main(string[] args) { CLRviaCSharp_9 c9 = new CLRviaCSharp_9(); c9.MyName = "myname"; Console.WriteLine(c9.MyName); Console.ReadKey(true); } } }
执行后,终端上打印的MyName属性已经变成全部大写字母的了,虽然赋值的时候是小写字母。
在使用分部方法时,同样也有一些重要的原则和规则:
1)分部方法只能在分部类或结构中声明
2)分部方法返回值必须为void型
3)分部方法可以有ref参数,但不能有out参数。因为分部方法可以没有实现部分,所以不能初始化out参数。
4)分部方法的声明和实现的签名必须完全一致
5)如果分部方法没有实现部分,便不能在代码中创建一个委托来引用这个分部方法。
6)分部方法总是被视为private的。并且,分部方法的声明前不得添加private修饰。