C#之委托、事件、lambda

委托

委托是什么?

委托是一种封装方法的特殊机制,可以帮助程序员更灵活的调用相应的方法。

委托的使用

委托是一个可以引用方法的对象,所以在创建委托时,实际创建的是一个存储方法引用的对象。在程序运行期间,同一个委托能够用于调用不同的方法,只要改变它引用的方法就可以。所以,委托调用的方法不是在编译时确定的,而是在运行的时候确定的。

委托的声明

<span style="font-family:Microsoft YaHei;font-size:18px;">public delegate void DelegateClass()
</span>

委托的使用方法

(1)DelegateClass dc1=new DelegateClass(Program.Fangfa1);

(2)DelegateClass dc2=new DelegateClass(Fangfa1);

(3)DelegateClass dc3=Fangfa1;

(4)Aclass ac=new Aclass();

DelegateClass dc4=new DelegateClass(ac.Fangfa2);

多播委托

多播委托是指允许创建方法的调用列表或者链表的能力。当调用多播委托时,这些方法均会自动执行。如果委托具有返回值,则将列表中最后一个方法的返回值用做整个委托调用的返回值。方法链表的创建:首先实例化一个委托,然后使用“+”或“+=”运算符为链表添加方法。在移除一个方法的时候,可以使用“-”或“-=”运算符。

<span style="font-family:Microsoft YaHei;font-size:18px;">public delegate void StrOp(ref string str)
StrOp strop;
StrOp op1=Hanshu1;
StrOp op2=Hanshu2;
strop=op1;
//移除方法1,添加方法2
strop-=op1;
strop+=op2;
</span>

事件

事件构建在委托的基础上,事件是一种信号机制,它在某些操作发生时自动地发出通知。事件定义为对象发送的消息,发信号通知操作的发生。

声明事件

public event AbcDelegate Abcevent;

AbcDelegate是委托名称, Abcevent;是事件名称

使用事件

(1)订阅事件

eventname += delegatename

eventname:事件名称

delegatename:方法名称

(2)取消订阅事件

eventname -= delegatename

lambda

lambda用于创建匿名方法

表达式:param=>expr

param(参数)

expr(表达式)

<span style="font-family:Microsoft YaHei;font-size:18px;">public delegate int Adelegate(int abm)
class Program
{
      static void Main(string[] args)
      {
             Adelegate a=count=>count+5;
             int x=0;
             for(int i=0;i<10;i++)
            {
                   x=a(x);
                   Console.WriteLine(x);
            }
            Console.ReadLine();
       }
}</span>

Ps:

事件和lambda匿名方法都是建立在委托基础上的,都是委托对象实现的。

时间: 2024-11-01 10:49:41

C#之委托、事件、lambda的相关文章

委托、Lambda表达式、事件系列07,使用EventHandler委托

谈到事件注册,EventHandler是最常用的. EventHandler是一个委托,接收2个形参.sender是指事件的发起者,e代表事件参数. □ 使用EventHandler实现猜拳游戏 使用EventHandler实现一个猜拳游戏,每次出拳,出剪刀.石头.布这三者的其中一种. 首先抽象出一个被观察者,其中提供了事件,提供了执行事件的方法. public class FistGame { public string FistName { get; set; } public event

委托、Lambda表达式、事件系列05,Action委托与闭包

来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); Console.WriteLine(i); } 结果是期望能的2.但令人好奇的是:栈上的变量i是如何传递给Action委托的? 反编译进行查看,首先看Main方法对应的IL代码: 再看c_DisplayClass1的IL代码: 从中可以看出:→在托管堆上创建了一个名为c_DisplayClass1的实例→把

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托

在"委托.Lambda表达式.事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性"中,反编译委托,发现委托都是多播委托. 既然委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链, 它是怎样形成的?来看下面的例子: namespace ConsoleApplication3 { internal delegate void MySayDel(string msg); class Program { stati

委托、Lambda表达式、事件系列06,使用Action实现观察者模式

在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式. 就举一个足球场上的例子,当裁判吹响终场哨,胜队庆祝,失败队落寞.把裁判看作是被观察者,比赛中的两队看作是观察者. 裁判作为被观察者需要提供一个Action委托供观察者方法注册. public class Referee { public Action DoSth; public void ISayGameOver() { Co

委托、Lambda表达式、事件系列03,从委托到Lamda表达式

在"委托.Lambda表达式.事件系列02,什么时候该用委托"一文中,使用委托让代码简洁了不少. namespace ConsoleApplication2 { internal delegate bool MyCalculateDelegate(int val); class Program { static void Main(string[] args) { IEnumerable<int> source = new List<int>(){2, 3, 4

委托、Lambda表达式、事件系列02,什么时候该用委托

假设要找出整型集合中小于5的数. static void Main(string[] args) { IEnumerable<int> source = new List<int>(){2, 3, 4, 5, 6, 7, 8, 9,10, 11}; var result = GetNumbersLessThanFive(source); foreach (int n in result) { Console.WriteLine(n); } } static IEnumerable&

C#委托事件

1.委托事件关键词:delegate 2.在声明函数的时候在函数类型后面加上 例:public delegate int Test(int x,int y) 3.定义委托变量:Test t1,委托接收的是方法引用. 4.委托变量可以当成函数的调用.用赋值“=” 委托变量 = 函数名 5.委托类型的变量,可以引用任何一个满足要求的方法,类似于C语言的函数指针. 6.一个委托变量可以使用“+=”挂接多个方法,也能使用“-=”动态地移除某个方法的引用. 7.引用多个方法的委托变量称为“多路委托”. 8

观察者(Observer)模式 * 委托事件

观察者(Observer)模式:定义了一种一对多的依赖关系.让多个观察者对象同时监听某一个主题对象.   这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己 /* * 抽象主题(Subject)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者. 抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现. * 抽象观察者(Observer)角色:为所有的具体观察者定义

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

匿名函数 匿名函数(Anonymous Function)是表示"内联"方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托:如果是表达式树类型,则转换将计算以对象结构形式表示方法结构的表达式树.  匿名函数有两种语法风格:Lambda表达式(lambda-expression)和匿名方法表达式(anonymous-method-ex

十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

委托与Lambda表达式 1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树 一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来提供相同的功能, 它将方法作为对象封装起来,允许在"运行时"间接地绑定一个方法调用. 声明的委托相当于一种自定义的数据类型. 1.背景 冒泡排序 1 static class SimpleSort1 2 { 3 public static void BubbleSort(int[] items)