• C#委托入门


    经典的关于委托的详解  http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html

    这里从网上找到的的实例,适合新手test下:

    委托(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());
             }
         }
    

      我们知道委托是对方法的封装,而且委托可以封装很多方法形成委托链,其实委托就好像是一个容器,他封装了我们想要实现的若干方法,当调用委托对象(相当于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中移出委托是无效操作

    本文转载自:http://blog.csdn.net/huomm/article/details/1897010

  • 相关阅读:
    ACM常用算法及练习(2)
    ACM常用算法及练习(1)
    ACM进阶计划
    《算法艺术与信息学竞赛》题目-提交方式对照表
    ACM之Java速成(4)
    ACM之Java速成(3)
    ACM之Java速成(2)
    ACM之Java速成(1)
    uva 11520
    uva 10755
  • 原文地址:https://www.cnblogs.com/xiepeixing/p/2635780.html
Copyright © 2020-2023  润新知