学习系列之扩展方法

Posted StrugglingDave

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习系列之扩展方法相关的知识,希望对你有一定的参考价值。

一 扩展方法的定义

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

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

二 扩展方法的特点

 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();
        }
    }

 

以上是关于学习系列之扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

nopCommerce 3.9 大波浪系列 之 路由扩展 [多语言Seo的实现]

nopCommerce 3.9 大波浪系列 之 路由扩展 [多语言Seo的实现]

ES6新语法之---函数扩展

Java8系列之初识

系列文章--突袭HTML5

6大设计原则之开闭原则