• 扩展方法


        这篇谈谈扩展方法,顾名思义,扩展即对某一个事物进行增加,或者增加一些功能。那扩展方法呢?比如我们现在有一个类A,但是这个类就标记成了sealed,我们不能继承这个类,又或者我们现在手上有一个dll,可以是买来的,可以是任何途径你得到的,但是你发现这个dll中有一个些类的功能并不是你想要的,或者没有你想要的,但是你却加不了任何方法。这个时候就可以用扩展方法。扩展方法即扩展我们想要扩展功能但却不能继承,不能修改源代码的类。

        首先,扩展framerwork的string类,因为string类是sealed类

        首先是扩展类

    namespace ExtensionMethod
    {
       public static class ExtensionString
        {
           public static void Extension(this string s)
           {
               Console.WriteLine("String is Extensioned");
           }
        }
    }
    

    扩展类是静态的,扩展方法也是静态的,方法的参数名称是要扩展的类型,为了区分参数,和扩展的类型,必须在要扩展的类型前加this关键字。

     调用代码

     static void Main(string[] args)
            {
                string s = "Hello World";
                s.Extension();
                Console.Read();
            }
    

    下面我们在扩展类里面加上一个重载方法

    public static class ExtensionString
        {
           public static void Extension(this string s)
           {
               Console.WriteLine("String is Extensioned");
           }
    
           public static void Extension(this string s, string name)
           {
               Console.WriteLine("Hello:"+name);
           }
        }
    

    加上一个有参数的,name。

    调用代码

     static void Main(string[] args)
            {
                string s = "Hello World";
                s.Extension();
                s.Extension("Edrick");
                Console.Read();
            }
    

    下面我们看看扩展方法在我们无法获取源代码的dll类中的扩展

    新建项目,新建类Person,类里面没有任何代码

    namespace Edrick.Liu.People
    {
       public class Perosn
        {
           
        }
    }
    

    添加引用,添加我们来是扩展类

    namespace ExtensionMethod
    {
       public static class PersonExtension
        {
           public static void PrPerson(this Perosn p, string firstName,string lastName)
           {
               Console.WriteLine(firstName+","+lastName);
           }
        }
    }
    

    调用类

        class Program
        {
            static void Main(string[] args)
            {
                //string s = "Hello World";
                //s.Extension();
                //s.Extension("Edrick");
    
                Perosn p = new Perosn();
                p.PrPerson("Edrick", "Liu");
                Console.Read();
            }
        }
    

    我们新建一个类Student继承Person,

    namespace ExtensionMethod
    {
       public class Student:Perosn
        {
           public Student()
           {
               
           }
        }
    }
    

    我们在调用Student的时候可以访问到Person的扩展方法

            static void Main(string[] args)
            {
                //string s = "Hello World";
                ////s.Extension();
                ////s.Extension("Edrick");
    
                //ExtensionString.Extension(s);
    
                //Perosn p = new Perosn();
                //p.PrPerson("Edrick", "Liu");
                //Console.Read();
    
                Student student = new Student();
                student.PrPerson("Edrick", "Liu");
                Console.Read();
            }
    

    说明子类可以访问到父类的扩展方法。

    个人对扩展方法的建议

    1,它反应不了类的真实意图,即一个类想要完成的某个对象功能被拆散分布在多个类文件中,我们在调用扩展类的时候其实是调用的静态类,只是把扩展的类型当做参数传入静态方法中ExtensionString.Extension(s);但是我们本想string完成的功能却在扩展类的代码中。所以,我们在想扩展密封类的时候扩展方法可以起到很好的作用,但是如果类可以继承,个人觉得最好还是继承类。

    2,在维护性会有一定的影响,但是不大。

  • 相关阅读:
    对QR码的初步研究(附:在博客里放上博客文章的QR码)
    EonerCMS——做一个仿桌面系统的CMS(十四)
    终于病了
    【HoorayOS】开源的Web桌面应用框架(第二版 v120311)
    【HoorayOS】开源的Web桌面应用框架——EonerCMS更名为HoorayOS
    一句代码实现 HTML5 语音搜索
    HTML5 拖拽上传图片实例
    【HoorayOS】开源的Web桌面应用框架
    【HoorayOS】开源的Web桌面应用框架(文件夹功能分析)
    从源码分析常见的基于Array的数据结构动态扩容机制
  • 原文地址:https://www.cnblogs.com/ColeLiu/p/2214530.html
Copyright © 2020-2023  润新知