码迷,mamicode.com
首页 > 其他好文 > 详细

c# 委托小姐

时间:2014-07-22 22:35:16      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   width   io   

  委托在c# 1 时代产生出来的时候,估计无人可以预想到会对C#语言产生如此大的影响。c#1 要创建委托实例。必须指定委托的类型和操作。

  •  声明委托  public delegate bool CompareHandler(int x,int y);
  • 操作方法:
    public bool CompareData(int x,int y)
    {
       return x>y;
    }

     

  • 绑定  CompareHandler handler = new CompareHandler(CompareData);
  • 构建链式委托采用  Delegate.Combine(handler,...) , Delegate.Remove();

c# 2.0 时代加入了语法糖 += ,-=构建链式委托.同时支持委托的协变与逆变。

 

方法组转换:

      方法组就是重载方法。方法组可以隐式转换为兼容的委托。

  public delegate void EventHandler(object o,EventArgs e);

       public TestMethod(){}

      public TestMethod(object o,EventArgs e){}

     EventHandler h=TestMethod;

不过 方法组不能隐式的转换Delegate,  显示转换如下 

Delegate  d = (EventHandler)TestMethod

并且对于已经重载转换委托类型的方法,就不能把它作为方法参数使用,下面的 就会出现错 参数 1: 无法从“方法组”转换为“System.Delegate” 

 public delegate void EventHandler(object o, EventArgs e);
        public static void TestMehod(object o, EventArgs e)
        {
        }

        public static void TestMethodt(Delegate d)
        {
        }

            TestMethodt(TestMehod);

采用强制转型  TestMethodt((EventHandler)TestMehod);

 

委托匿名方法转换

    匿名方法转换 在ECMA 344 13.5

         1.无返回类型参数匹配 

            Action<int> s = delegate{ };
            Action<int> a = delegate(int x) { };

 

        3.匿名方法闭包: 

      闭包 抓取的是就是变量本身。如下的两种情况。对于counter来说List中抓的都是新的实例。对于i所有的list都是同一个变量

 List<Action> lst = new List<Action>();
            for (int i=0;i<3;++i)
            {
                int counter = i*10;
                lst.Add(delegate
                {
                    Console.WriteLine("values is "+i);
                    i++;
                });

            }
            foreach (var  t in lst)
            {
                t();
            }
            lst[0]();
            lst[0]();
            lst[2]();
            lst[2]();
       

 

  List<Action> lst = new List<Action>();
            for (int i=0;i<3;++i)
            {
                int counter = i*10;
                lst.Add(delegate
                {
                    Console.WriteLine("values is " + counter);
                    counter++;
                });

            }
            foreach (var  t in lst)
            {
                t();
            }
            lst[0]();
            lst[0]();
            lst[2]();
            lst[2]();

c# 委托小姐,布布扣,bubuko.com

c# 委托小姐

标签:style   blog   color   使用   width   io   

原文地址:http://www.cnblogs.com/nessie/p/3860333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!