c# 委托的学习

转载 2012年03月25日 15:03:06
委托(delegate)是一种引用类型,我们在处理他的时候要当作类来看待而不是方法,说白了委托就是对方法或者方法列表的引用,调用一个委托实例就好像是调用c++中的指针一样,他封装了对制定方法的引用,或者说委托起到的是桥梁的作用,实例后的委托对象会将给定的参数传递给他所回调的方法,并去执行方法。

       看一个简单的例子:

     //声明一个委托
    delegate int myDelegateHandler(int a, int b);

    public class A
    {
        //静态的处理方法
        public static int M1(int a, int b)
        {
            int c = 0;
            c = a + b;
            return c;
        }
    }
    //入口类
    public class B
    {
        public static void Main()
        {
            //实例一个委托
            myDelegateHandler mdh = new myDelegateHandler(A.M1);
            //调用委托
            int sum = mdh(2, 2);
            Console.WriteLine(sum.ToString());

        }
    }

    上面是一个非常简单的例子,具体的实现步骤:

           1、 先声明个委托实例  ;

           2、然后提供要处理的方法;

           3、再实例化委托(把委托看作是类的话,实例化委托就不难理解了,其参数是要处理的方法,这里的方法 不用加括号,实例化的过程就是装载方法的过程,就好像需要参数的构造函数一样)实例化后的委托对象就好比是c++中的指针,它本身就是封装了方法的对象;

          4、最后我们调用委托对象就好比是调用了被封装方法本身,调用时的参数也就传给了被封装的方法。

           5、需要注意的是 所声明的委托无论是 参数个数,参数类型,返回值类型 都要和所要封装的方法保持一致,当调用委托实例对象时,所传入的参数也要保持一致 ,否则会出现错误。 

 

 

        委托链

        我们知道委托是对方法的封装,而且委托可以封装很多方法形成委托链,其实委托就好像是一个容器,他封装了我们想要实现的若干方法,当调用委托对象(相当于c++中的指针)时,就会顺序的执行它所封装的所有的方法,如果有返回值的话,往往返回的是最后一个被执行的方法的返回值,委托链的形成可以用"+="或"-="对不同的委托实例进行二元操作。

    委托链实例:

              //定义一个委托
    public delegate void PrintHandler(string message);

    public class PrintProvider1
    {
        public void Print(string msg)
        {
            Console.WriteLine( msg + "1111111");
        }

    }

    public class PrintProvider2
    {
        public void Print(string msg)
        {
            Console.WriteLine( msg + "2222222");
        }

    }

    class Delegate1
    {
        public static void StaticPrint(string msg)
        {
            Console.WriteLine(msg + "3333333");

        }

        public static void Main()
        {
            string s = "委托链";
            PrintProvider1 pp1 = new PrintProvider1();
            PrintProvider2 pp2 = new PrintProvider2();
            //创建委托实例
            PrintHandler prn1 = new PrintHandler(pp1 .Print );
            PrintHandler prn2 = new PrintHandler(pp2 .Print );
            PrintHandler prn3 = new PrintHandler(StaticPrint );

            Console.WriteLine("委托实例prn1的打印结果");
            prn1(s );

            Console.WriteLine("委托实例prn2的打印结果");
            prn2(s);

            Console.WriteLine("委托实例prn1+prn2的打印结果");
            PrintHandler prn = prn1 + prn2;
            prn(s);

            Console.WriteLine("委托实例prn1+prn2+prn3的打印结果");
             prn += prn3;
            prn(s);

            Console.WriteLine("委托实例prn1+prn3的打印结果");
            prn -= prn2;
            prn(s);

            Console.WriteLine("委托实例prn3的打印结果");
            prn -= prn1;
            prn(s);

            Console.WriteLine("试图调用null委托会引发异常");
            try
            {
                prn -= prn3;
                prn(s);

            }
            catch (NullReferenceException ex)
            {
                Console.WriteLine(ex .Message );
            }

            Console.WriteLine("试图从null中移出委托是无效操作");
            try
            {
                prn -= prn3;
            }
            catch (NullReferenceException ex)
            {
                Console.WriteLine(ex .Message );

            }

            Console.Read();

        }

    }

执行结果

委托实例prn1的打印结果
委托链1111111
委托实例prn2的打印结果
委托链2222222
委托实例prn1+prn2的打印结果
委托链1111111
委托链2222222
委托实例prn1+prn2+prn3的打印结果
委托链1111111
委托链2222222
委托链3333333
委托实例prn1+prn3的打印结果
委托链1111111
委托链3333333
委托实例prn3的打印结果
委托链3333333
试图调用null委托会引发异常
未将对象引用设置到对象的实例。
试图从null中移出委托是无效操作

c# 委托的学习日记

                曾经对委托和事件非常头疼,好在现在以自己的方式入门了,就行以自己的方式把它过一遍,当作学习日记吧。      委托(delegate)是一种引用类型,我们在处理他的时候...
  • huomm
  • huomm
  • 2007年11月21日 20:47
  • 19180

C#委托、事件学习之(三)——热水器烧水案例

using System; namespace DelegateExample { public class Heater { private int tempera...
  • lucky51222
  • lucky51222
  • 2015年09月14日 11:17
  • 2463

[深入学习C#]匿名函数、委托和Lambda表达式

匿名函数  匿名函数(Anonymous Function)是表示“内联”方法定义的表达式。匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情)。匿名函数转换的计算...
  • honantic
  • honantic
  • 2015年06月02日 16:38
  • 8216

C#学习日记30---泛型类、泛型方法、泛型委托

泛型允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,在声明类或方法的时候由于不知道用户要传入什么样类型的参数,所以在传入类型的地方“挖一个坑(“<T>”)"...
  • HC666
  • HC666
  • 2015年10月23日 21:57
  • 3332

C#中委托的理解(方便Java的童孩们理解)

C#中委托的理解(方便Java的童孩们理解)   定义:委托即Java中的抽象方法,是一个没有实现的方法,没有方法体。要在程序运行的时候才知道它的具体运行的是哪一部分代码(这个定义是从Java角度理解...
  • u012465377
  • u012465377
  • 2013年10月24日 21:22
  • 669

c#中委托的使用

这篇文章主要介绍了C#中委托的用法,包括委托的功能、定义及用法示例,需要的朋友可以参考下 本文以实例形式简单介绍了C#中委托的用法,是深入学习C#程序设计所必须掌握的重要技巧。现以教程形式...
  • ycl295644
  • ycl295644
  • 2015年06月08日 15:20
  • 1880

C#委托及各种写法

C# 委托及各种写法 委托是嘛? 委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进...
  • Blues1021
  • Blues1021
  • 2015年10月01日 09:41
  • 818

C#之委托(函数参数传递)

在学委托这块儿的时候,函数参数这块不是很理解,于是针对一个例子做了深入的理解,和大家分享一下。         首先,先说一下我对委托的理解,委托就是一个可以执行多种同类功能的变量,之所以它是执行同类...
  • wangdan199112
  • wangdan199112
  • 2014年01月26日 17:03
  • 6939

C#语法小知识(十三)带返回值的委托

委托的相关基础知识请参考C#语法小知识(四)委托delegate,这里讨论一下带返回值的委托如何处理。...
  • ecidevilin
  • ecidevilin
  • 2016年10月17日 11:41
  • 2154

C#内置的几种委托详解,lambda表达式的演变

系统内置的委托              使用委托:方法的签名要和委托一致。     1.System.Func 代表有返回类型的委托               |--public deleg...
  • q646926099
  • q646926099
  • 2016年08月26日 10:43
  • 716
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c# 委托的学习
举报原因:
原因补充:

(最多只允许输入30个字)