展开
湖北国联计算机科技有限公司
  • 首页HOME
  • 公司简介INTRODUCTION
  • 安全防御DEFENSE
  • 软件开发SOFTWARE
  • 物联网IOT
  • 运行维护SRE
  • 成功案例CASE
  • 联系我们CONTACT
  • Software Technology Sharing |技术分享

    C#中的扩展方法
    来源:荆州网站建设 时间:2017-05-21

    在java中没有这样的东西,一个类一旦是 final的,这个类就不能再被添加方法,但是C#能够做到,可以给 sealed 类添加新的方法,这点我还是比较喜欢c#的。

    这就是C#中的扩展方法。

    那么什么情况下我们才需要去给一个类写扩展方法呢?

    系统自带的类型,我们无法去修改;

    修改源代码需要较大的精力,而且可能会带来错误;

    我们只是需要一个或者较少的几个方法,修改源代码费时费力;

    被扩展的类是sealed的,不能被继承;(就算不是sealed的,我们也不能因为需要一个方法而去写一个子类,这样不是面向对象)

    下面是扩展方法的三个要素:(也算是语法规则)

    扩展方法必须处于一个静态类中;

    扩展方法必须是一个静态方法;

    扩展方法的参数列表必须以 this 开头,this 后面紧跟的是被扩展类,然后才是方法需要的参数;

    下面就举一个栗子:

    我们一般将字符串类型的数字转换为int类型,一般都是用的 int.Parse() 方法,或者 Convert类的方法,我们能不能给 string 类型添加一个 Parse方法呢?

    当然是可以的,代码上来先:(这里只写了无参数的扩展方法,有参数的直接在参数列表中添加即可,调用时传递对应参数)

    using System;

    namespace ConsoleApplicationTest

    {

    public static class stringExtensionMethod

    {

    public static int Parse(this string str)

    {

    return int.Parse(str);

    }

    }

    class Program

    {

    static void Main(string[] args)

    {

    string str = "111";

    int i = str.Parse();

    Console.WriteLine("i: " + i);

    }

    }

    }

    复制代码

    有一点可能不好理解,为什么参数列表里面有参数,但是在调用的时候却不传递参数,对于这点我之前也是有点迷糊,但是想通了就好了,那里不是有个 this 关键字吗?this指代的就是当前对象嘛,也就是被扩展类的实例,也就是扩展方法的调用者,既然是调用者,那还把它当参数传,肯定不传呀。

    下面写一下扩展方法的特点:

    1、this关键字紧跟着的不是参数,而是调用者,调用者后面的参数才是扩展方法真正的参数,在调用时必须传递;

    2、如果被扩展的类中的实例方法和扩展方法的方法签名相同(扩展方法中方法的签名应该要去掉this和调用者参数),则优先调用本类中的实例方法;

    3、被扩展类(可以是普通类,也可以是接口抽象类)的子类对象可以直接调用父类的扩展方法,也就是说子类也继承了父类的扩展方法;

    4、这点算是第 3 点的补充,只有被扩展类的本类对象或者子类对象,才能调用扩展方法;



    以上由湖北国菱荆州软件开发、荆州网站建设工程师整理发布。喜欢程序开发的伙伴们欢迎一起交流探讨。Email:business@gl-ns.com,电话:0716-6666211.

    荆州地区政府网站建设 解决方案 专业团队 腾讯第三方平台 地址:湖北省荆州市沙市区荆沙大道楚天都市佳园一期C区29栋112       地址:湖北省松滋市才知文化广场1141-1142号     邮编:434200 联系电话:0716-6666211     网站编辑部邮箱:business@gl-ns.com 鄂公网安备 42100202000212号 备案号:鄂ICP备2021015094号-1     企业名称:湖北国菱计算机科技有限公司