大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > 委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

关键词:委托Lambda表达式事件  阅读(545) 赞(13)

[摘要]本文是对委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性的讲解,对学习C#编程技术有所帮助,与大家分享。

委托是一个类。


namespace ConsoleApplication1

{

    internal delegate void MyDelegate(int val);

    class Program

    {

        static void Main(string[] args)

        {

        }

    }

}


使用Reflector查看委托的IL代码:

1
○ 委托的确是一个类
○ 委托的构造函数接收方法和类实例
○ 而且是多播委托,可以用+=为委托变量赋值
○ 委托内部使用Invoke方法触发方法
○ BeginInvoke和EndInvoke方法用于多线程场景

接下来体验委托如何使用,以及委托的Method和Target属性分别代表什么。


namespace ConsoleApplication1

{

    internal delegate void MyDelegate(int val);

    class Program

    {

        static void Main(string[] args)

        {

            //委托与静态方法

            MyDelegate d = new MyDelegate(M1);

            d(10);

            Console.WriteLine(d.Method);

            if (d.Target == null)

            {

                Console.WriteLine("当前委托调用的是静态方法,没有类实例");

            }

            else

            {

                Console.WriteLine("当前委托调用的是实例方法,类实例为:" + d.Target);

            }

            Console.WriteLine("-------------------");

            

            //委托与实例方法

            Program p = new Program();

            d = p.M2;

            d.Invoke(10);

            Console.WriteLine(d.Method);

            if (d.Target == null)

            {

                Console.WriteLine("当前委托调用的是静态方法,没有类实例");

            }

            else

            {

                Console.WriteLine("当前委托调用的是实例方法,类实例为:" + d.Target);

            }

        }


        static void M1(int val)

        {

            Console.WriteLine("我是静态方法,输出" + val);

        }


        void M2(int val)

        {

            Console.WriteLine("我是实例方法,输出" + val);

        }

    }

}




2

○ 委托创建:通过委托构造函数,new MyDelegate(M1);也可通过d = p.M2,这是一种"语法糖"写法,其内部也调用了委托构造函数。
○ 委托与静态方法:只要两者参数列表和返回类型一致,可把静态方法传给委托构造函数
○ 委托与实例方法:只要两者参数列表和返回类型一致,可把实例方法传给委托构造函数
○ 委托调用:像d.Invoke(10),通过委托的实例方法Invoke调用;像d(10),这是一种"语法糖"写法,其内部也调用了实例方法Invoke。
○ Target属性:委托所表示实例方法所属的类实例名称,如果是静态方法,Target为null
○ Method属性:委托所表示的方法,可能是静态方法,也有可能是实例方法



相关评论