zoukankan      html  css  js  c++  java
  • 初识C#扩展方法

    1)扩展方法是什么?

    扩展方法可以在不修改原有类的代码前提下,给类“增加”一个方法。扩展方法虽然属于静态方法,但调用的语法却和对象调用类似。直接用一个例子来演示扩展方法。

    1.准备实体类

    public class Person
        {
            public Person(string name, int age)
            {
                this.Name = name;
                this.Age = age;
            }
            public int Age { get; set; }
            public string Name { get; set; }
        }
    Person实体类代码

    2.准备一个静态类和一个静态方法

    public static class MyTest
        {
            public static void SayHello(this Person per1, string flag)
            {
                Console.WriteLine("你好,我是{0},年龄{1},{2}", per1.Name, per1.Age, flag);
            }
        }
    View Code

    3.主函数代码如下

    class Program
        {
            static void Main(string[] args)
            {
                Person per1 = new Person("per1", 21);
                per1.SayHello("握手");
                Console.ReadKey();
            }
        }
    View Code

    在本次实验里,MyTest静态类里的SayHello()就是扩展方法。定义扩展方法的标准是:第一个参数类型是被扩展的类型,类型前面标注this。扩展方法其实也可以被当成普通的静态方法使用,比如上面的主函数代码修改成如下状况也能正常使用,当然只是强调一下而已,既然已经写成扩展方法,那最好还是当成扩展方法使用才方便:

    class Program
        {
            static void Main(string[] args)
            {
                Person per1 = new Person("per1", 21);
                MyTest.SayHello(per1, "握手");
                Console.ReadKey();
            }
        }
    View Code

    2)为什么使用扩展方法?

    字面意思,就好像给一个类又增加了一个方法。在上面演示中,用Person对象去调用的SayHello()方法就好像是Person类内部的方法,然而这个方法却属于MyTest静态类。或许会觉得很奇怪,为何不直接在Person类内部加一个public void SayHello(string flag)方法就完事。实际上扩展方法的好处在于,对于已经封装好的类,不用再去修改类内部代码便能完成对类扩充一个方法,这提高了对类的扩展性。比如在Winform窗体程序中,对于TextBox的一个对象,要去判断Text属性值是否为a123,直接写一个扩展方法并让这个对象去调用,部分代码如下:

    1.在窗体程序上增加一个TextBox文本框,一个Button按钮

    2.增加一个静态类

    static class Check
        {
            public static bool CheckTest(this TextBox txt1)
            {
                return txt1.Text == "a123";
            }
        }
    View Code

    3.给Button按钮新建单击事件,代码如下

    private void button1_Click(object sender, EventArgs e)
            {
                bool a = textBox1.CheckTest();
                MessageBox.Show(a.ToString());
            }
    View Code

    4.运行测试

    在上面演示中,TextBox类是微软已经封装好的类,但却可以做到在内部添加了一个CheckTest()方法的效果。

    3)对于扩展方法的总结

    1.扩展方法所在的类必须是静态类,也就是被static修饰的类

    2.扩展方法的第一个参数类型是被扩展的类型,类型前面标注this

    3.使用扩展方法的代码必须添加对扩展方法所在类的namespace的using

    4.扩展方法最终其实还是被编译器处理成普通静态方法的调用了

    5.扩展方法由于本质上还是静态方法的调用,所以不能访问类外部访问不了的成员

    6.该文章只是对扩展方法的初步理解,网上对于扩展方法的好印象更多来源于Linq的使用。但因为自己对扩展方法接触还不太深,因此说声抱歉。

  • 相关阅读:
    君の知らない物語
    2.OSI各层概述
    [ unittest ] 使用初体验
    1.分层结构、协议、接口、服务
    [flask] jinja自定义filter来过滤html标签
    [Flask] Flask问题集(后端模板渲染项目)
    [服务器部署] Flask + virtualenv + uWSGI + Nginx 遇到的问题
    android控件的对齐方式(转)
    AIDL
    歌词的获取
  • 原文地址:https://www.cnblogs.com/tthjHiroki/p/8042196.html
Copyright © 2011-2022 走看看