c# 委托小姐

委托在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# 委托小姐

时间: 2024-10-06 01:26:16

c# 委托小姐的相关文章

成员函数指针与高性能的C++委托

成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托 (delegate)")在一些语言中已经证明了它宝贵的价值.在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础.而在目前,C#使"委托&

委托回调静态方法和实例方法有何区别

分析问题 在开始分析委托内部构造之前,先来回顾一下最基本的概念,在C#中,静态方法和实例方法分别指什么,两者有什么区别.和其他大部分面向对象的高级语言相同,在C#中静态方法由关键字static来定义,静态方法可以通过类名来访问而不需要任何实例对象,相应的,在静态方法中不能访问类型中任何非静态成员.而实例方法需要通过具体的实例对象来调用,可访问实例对象中的任何成员. 现在来研究一下委托绑定实例方法和静态方法的区别.如上所述,当一个实例方法被调用时,需要通过实例对象来访问,可以想象,绑定一个实例方法

c#系统泛型委托

Action<T> 无返回值的系统泛型委托 namespace ConsoleApp1 { public class UserInfo { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } class Program { private static List<UserInfo> getInit() { return new List<User

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

C# 委托,Lambda表达式,事件

本文章参考sikiC#高级篇,转载请注明出处. 什么是委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托与使用 声明委托有四种方式.一种是原生的,另外三种是C#为了方便给我们封装好的. 四种声明方式分别为delegate, Action, Func, 在C#中使用一个类分为两个阶段,首先定义这个类,告诉编译器这个类由什么字段和方法组成,然后使用这个类实例化对象.在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编

泛型委托当参数传递

假如有一个Person类: public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Title { get; set; } } 执行一个方法: /// <summary> /// 传递一个泛型委托方法 /// </summary> /// <param name="acti

类库,委托,is和as运算符,泛型集合

类库:其实就是一堆类文件,只不过用户看不到这些类的源代码,保密性好. 优点:保密性好缺点:如果这个方法不好用,使用者无法自己去更改它. 类文件是.cs    类库是.dll 新建项目为类库,在debug文件夹下找到dll文件 委托:委托可以理解为:函数的指针 关键词:delegate 声明委托类型:public delegate int FirstDel(int a, int b); FirstDel不是类,是委托变量,不能实例化(不能new), 创建委托变量:FirstDel 名字 = 与这个

泛型委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 泛型委托 { public delegate int DelCompare<T>(T t1, T t2); // public delegate int DelCompare(object o1, object o2); class Progra

javascript中的事件委托

这几天看到一个面试题,大概就是,让你给1000个li都添加一个click事件,应该怎么添加?大多数人第一开始的感觉可能就是,每个li上边都添加一个呗,那要是这样的话,估计面试的时候就会GG了,这里就是撤出了我们的事件冒泡和捕获机制,以及事件委托机制,对于上边这些,我们慢慢来看. 首先说一下事件冒泡和事件捕获机制,事件冒泡是有微软公司提出来的,事件捕获是有网景公司提出来的,当时两家是争论的不可开交,后来w3c也没办法,就采取了折中的方式,事件产生后先捕获后冒泡, 通常,在js中监听事件的方法共有三