C#中委托与事件的学习小结(一)

最近又学习了一些C#的小知识点,在此发布博客记录一下。

一、委托

C#中的委托的关键字是delegate,我们可以使用委托类型来将已有的方法实例化出来,也可以将我们自己定义的方法作为参数来传递。

例如: private delegate string GetAString();//我们定义一个委托类型,这个委托的名字是GetAString

             static void Main(string[] args)
        {     

            int x = 40;//定义了一个变量为x,为其赋值为40

            GetAString a = new GetAString(x.ToString);//传递一个方法为参数,相当于a指向了x中的ToString方法。

            //GetAString a = x.ToString;//第二种赋值方法,直接将方法赋值给委托变量。

            string s = a();//通过委托的实例去调用x中的ToString方法。

            Console.WriteLine(s);

            Console.ReadKey();

        }

上面这个例子中,存在两种对委托类型变量a的赋值,第一种方法是直接改变a的指向,将ToString方法作为参数,传递给a,而第二种方法,则是直接将x中的方法赋值给a。这是已有方法ToString利用委托类型实例化出来的例子。下面分享一个自己定义方法作为参数进行委托传递的例子。

例:

        private delegate void PrintString();//首先定义一个委托类型

        static void PrintStr(PrintString print)//委托类型可以作为参数传递。
        {
            print();
        }

      //定义的变量需要初始化才可以使用,所以新创建两个方法,用来初始化method;

        static void Method1()
        {
            Console.WriteLine("method1");
        }
        static void Method2()
        {
            Console.WriteLine("method2");
        }

        static void Main(string[] args) {

            PrintString method=Method1;//使用Method1方法来初始化method委托变量
            PrintStr(method);//利用定义好的函数PrintStr来输出method方法
            method = Method2;//委托类型重新复制,调用参数改变,输出结果也改变
            PrintStr(method);
            Console.ReadKey();

        }

大家可以注意到,我输出了2次method委托变量,但是2次的结果是不同的,因为我们利用赋值的方式,在输出Method1方法后将委托变量的值改变为Method2方法。而这个方法参数,正是我们一开始定义的PrintString委托类型的print方法。

二、Action委托和Func委托

下面说一下C#语言中为我们定义好的两个委托类型:

1、Action委托

这个委托最大的特点是它只能指定没有返回值的方法,也就是void类型的方法,而他传递的方法中可以包含0个或多个参数。也就是说,既没有参数也没有返回值的方法也可以通过Action委托进行传递。

例:  static void PrintDoubleInt(int i1, int i2)//我们先定义一个方法,注意它没有返回值
        {
            Console.WriteLine(i1+i2);
        }

        static void Main(string[] args)
        {

          Action<int , int> a=PrintDoubleInt;//我们将方法中的2个参数利用泛型<>来传递。

          a(23,33);//然后我们随意在委托变量a中传递两个参数。

          Console.ReadKey();

          }

这里要注意,Action后面泛型中的类型,一定要与声明此方法中的参数一一对应。然后输出结果为两个int参数的和。

2、Func委托

这个委托跟Action委托正好对应,他是必须要有返回值的委托类型。参数方面与Action委托要求基本一致,可以有0个或多个参数,但是方法的返回值类型不能为空。

例: static int Test3(int i, int j)
        {
            return i + j;
        }        

        static void Main(string[] args)
        {
            Func<int, int, int> a = Test3;//func后面必须指定一个返回值类型,参数类型可以有0-16个,
                                          //先写参数类型,最后一个是返回值类型。
            int res = a(1, 5);
            Console.WriteLine(res);
            Console.ReadKey();
        }

通过例子我们可以发现Func后面可以跟很多类型,最后一个是返回值类型,前面的类型是参数类型,参数类型必须跟指向的方法的参数类型按照顺序对应。

三、多播委托

下面跟大家说一下什么是多播委托。多播委托就是一个将各个委托集合到一起,做成一个Delegate[],然后我们同样可以通过foreach的方法,对其内部的委托进行查找。那么我们如何将各种方法集合到一起呢?下面写个小例子,大家就明白了。

例://常规创建两个测试方法:

        static void Test1()
        {
            Console.WriteLine("test1");
        }

        static void Test2()
        {
            Console.WriteLine("test2");
        }

        static void Main(string[] args)
        {
            Action a = Test1;//将Test1赋值给委托a;

            a += Test2;//通过+=符号,为委托变量增加Test2方法;

            a();

            Console.ReadKey();

           }

我们可以通过+=和-=这两个符号,对委托类型a中的方法集合进行增减,但是要注意,如果这个委托集合中有任何一个方法发生异常的话,整个集合的迭代都会停止。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值