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

  • 相关阅读:
    2015年中国互联网十大牛逼词汇
    考上好大学,然后进入IT行业是穷人孩子晋级中产的唯一出路?
    Redis中hash表中的field的value自增可以用hincrby
    如何学好编程(四)——这种方法真的有用吗
    挑战编程题(三)
    C++ 单链表的基本算法
    挑战编程题(二)
    程序员到底需要学习多少东西??
    Erlang 进制转换
    Erlang基础知识集锦
  • 原文地址:https://www.cnblogs.com/wang_yb/p/2095279.html
Copyright © 2020-2023  润新知