《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修饰。

posted @ 2011-07-01 10:19  wang_yb  阅读(647)  评论(0编辑  收藏  举报