zoukankan      html  css  js  c++  java
  • 进阶系列(4)——扩展方法

    一 扩展方法的定义

          扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异

         从字面上按照我们通常的理解,我们首先需要获得某个类的源代码,然后在这个类代码中增加成员方法,这样就可以达到为一个类提供扩展方法的目的。可是不幸地是,这种方法在没有源代码的情况下就无法奏效了,而且我们人为地去改变源代码有可能会破坏整个代码的稳定性。那么有没有一种方法能在不改变源代码的前提下为某个类提供扩展方法呢?这就是我们今天要说的扩展方法,所以我们可以将扩展方法理解为在不改变源代码的前提下向外部提供扩展方法的一种方式

    二 扩展方法的特点

     1、实现扩展方法的类必须是静态类且类的名称和实现扩展方法的类无关

     2、实现扩展方法的类方法必须是静态方法;

     3、实现扩展方法的类方法的第一个参数必须是使用this关键字指明要实现扩展方法的类

    三 代码演示

    (一)扩展c#自身存在的类

            我们知道将一个合法字符串类型转换为整型,可以使用int.parse()方法,假如我们希望为string类型扩展一个ToInt方法应该怎么办呢?我们一起来看下面的这段代码:

    namespace 扩展方法
    {
        /// <summary>
        /// 1、定义一个静态类
        /// 2、静态类的名称和要实现扩展方法的具体类无关
        /// </summary>
        public static class SomeClass
        {
            /// <summary>
            /// 3、实现一个具体的静态方法
            /// </summary>
            /// <param name="str">4、第一个参数必须使用this关键字指定要使用扩展方法的类型</param>
            /// <returns></returns>
            public static int ToInt(this String str)
            {
                return int.Parse(str);
            }
        }
        class Program
        {
            static void Main(string[] args)
            {   
                
                string strOne = "123";
                int num = strOne.ToInt();
                Console.WriteLine(num);
                Console.ReadLine();
            }
        }
    }

    (二)扩展自定义类

        自身定义一个MyData类,其中包含一个构造函数和一个求三个数字和的方法,如果我们想在此类中添加一个求三个数字平均值的函数,会怎么做?继续在此类中添加?如果这个类是密封的怎么办?那么这个时候我们就可以使用扩展方法对MyData类进行扩展,以方便我们的进一步需求。

    class MyData
        {
            public double D1;
            public double D2;
            public double D3;
            public MyData(double d1, double d2, double d3)
            {
                D1 = d1;
                D2 = d2;
                D3 = d3;
            }
            public double sum()
            {
                return D1 + D2 + D3;
            }
        }
    
    
        /// <summary>
        /// 扩展MyData类,为此类扩展一个求平均值的方法
        /// </summary>
        static class ExtendMyData
        {
            public static double Average(this MyData md)
            {
                return md.sum() / 3;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                MyData md = new MyData(3, 4, 5);//调用MyData类中的构造函数为对象md赋值
                Console.WriteLine("和为{0}",md.Average());
                Console.ReadLine();
            }
        }

    四 this关键字的作用

         使用this关键字,可以向this关键字后面的类型添加扩展方法,而无需给其创建新的派生类型、重新编译或以其他的方式修改类型.

         扩展方法是一种特殊的静态方法,但可以像实例方法那样调用但是this关键字最主要的作用是对类型的重载方法的扩充,来满足自身的需求,因为有些类方法的重载方法可能不是很完善,而直接修改类型的条件不足(应为可能有些已经被编译成dll,有些测试.net框架的底层类),所以只能通过this关键字对其进行扩展,也就是完善类方法的重载方法。

    五 小结

    • 在C#中实现扩展方法的类必须是静态类且类的名称和实现扩展方法的类无关
    • 实现扩展方法的类方法必须是静态方法
    • 实现扩展方法的类方法的第一个参数必须是使用this关键字指明要实现扩展方法的类
    • 实现扩展方法应遵守就近原则,在最小的范围内使用扩展方法以避免造成“污染”
  • 相关阅读:
    一个网卡绑定多个IP和多个网卡用一个ip的设置
    Linux操纵细碎以太网卡的装配及设置2
    教你若何制作软盘版的 Linux系统防火墙
    Ubuntu Linux体系中装置GNOME初步劈脸菜单
    构筑Linux防火墙之集团用户设置防火墙1
    Linux系统Iptables端方执行按次过细讲解
    Proxy源代码分析 谈Linux收集编程身手
    Linux使用系统以太网卡的安装及设置装备陈设1
    操持Linux下Oracle Tomcat 8080端口争持2
    Linux操作体系上差别文件体系的兼容成就
  • 原文地址:https://www.cnblogs.com/wyh19941210/p/6764753.html
Copyright © 2011-2022 走看看