浅析C#---委托和事件

浅析C#---委托和事件

在C#开发中,有时我们需要实现这样的情况:只要新添加一个对象,就要执行一系列的方法。如果每次挨个调用,这样既浪费时间,又造成代码冗余。这个时候我们就可以使用委托来建立一个方法链条,设置好后,可以让一个对象依次去执行这个链条上的各个方法。这样的结果就是:简化了代码,提高了效率,提高了代码的可维护性。

究竟什么是委托呢?事件有何委托有什么关系呢?

一、定义

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

事件是一种特殊的委托,它在某些操作哦 发生时自动地发出通知。

二、使用

2.1、委托的使用

委托是一个能够引用方法的对象,能够调用它所指的方法。而且,在成宿运行七届,同一个委托可以条用不同的方法,只要改变它的引用的方法即可。所有委托类型的基类是System.Delegate类。

2.1.1、声明

像其他类一样,委托在使用之前也需要声明。委托类型声明将创建一个协定,该协定指定一个或多个方法签名。委托是委托类型的实例,它可以引用静态方法或实例方法。

语法:delegate-modifiers(修饰符) delegate(需使用的关键字) return-type(返回类型) identifier(类型名称)

2.1.2、注册方法

如果一个方法要注册到委托中,则该方法的签名必须与该委托所指定的签名完全匹配(即两者返回类型和方法参数须相同,参数具体的名称可以不同)

2.1.3、实例化委托

委托作为一个类,在使用前必须有实例化的过程。其实例化可以创建委托类型的实例,并向该实例注册方法列表。委托类型的实例的方法列表可以为静态方法,实例方法或者另外的委托。

下面可以通过一个实例我们来理解一下。

internal
delegate int
MyDelegate(int i);  
//声明委托

class
Program

{

//声明一个实例方法Method1(int i)

public
int Method1(int i)

{

Console.WriteLine("调用实例方法Method1(int i)");

return i;

}

//声明一个静态方法Method2(int i)

public
static int Method2(int i)

{

Console.WriteLine("调用实例方法Method2(int i)");

return i;

}

static
void Main(string[] args)

{

Program p =new
Program();

MyDelegate dDelegate =new
MyDelegate(p.Method1);     //将Method1注册到dDelegate中,并实例化dDelegate

int i = dDelegate(10);

Console.WriteLine("i的值为:" + i);

MyDelegate dMyDelegate =new
MyDelegate(Program.Method2);     //将Method2注册到dMyDelegate中,并实例化dDelegate

int j =dMyDelegate(20);

Console.WriteLine("j的值为:" + j);

Console.ReadKey();

}

}

2.1.4构建方法列表

使用委托可以将多个方法绑定到同一个委托变量,当调用此变量是,可以一次调用所有绑定的方法。

方法列表可以包含一个或多个方法。

2.1.5调用

委托是一个方法链条,因此调用委托实例就相当于调用了该委托实例半酣的所有方法。如果一个调用列表包含多个方法是,当该委托实例被调用是,它将按照调用列表中的方法注册顺序依次调用每一个方法(通过下面例子的运行结果可以看出)。

下面我们用一个例子说明一下

internal
delegate int
MyDelegate(int i);  
//声明委托

class
Program

{

//声明一个实例方法Method1(int i)

public
int Method1(int i)

{

Console.WriteLine("调用实例方法Method1(int i)");

return i;

}

//声明一个静态方法Method2(int i)

public
static int Method2(int i)

{

Console.WriteLine("调用实例方法Method2(int i)");

return i;

}

static
void Main(string[] args)

{

Program p =new
Program();

MyDelegate dDelegate1 =new
MyDelegate(p.Method1);     //将Method1注册到dDelegate中,并实例化dDelegate

MyDelegate dDelegate2 =new
MyDelegate(Program.Method2);     //将Method2注册到dMyDelegate中,并实例化dDelegate

MyDelegate dDelegate3 =dDelegate1 + dDelegate2;    //给委托dDelegate3实例注册方法

MyDelegate dDelegate4 =dDelegate3 - dDelegate2;    //给委托dDelegate4实例移除方法

int i1 =dDelegate1(20);Console.WriteLine("i1的值为:" + i1);

int i2 = dDelegate2(20);Console.WriteLine("i2的值为:" + i2);

int i3 =dDelegate3(20);Console.WriteLine("i3的值为:" + i3);

int i4 =dDelegate4(20);Console.WriteLine("i4的值为:" + i4);

Console.ReadKey();

}

}

执行结果:

2.2事件的使用

事件是某些操作发生时自动地发出通知。时间构建在委托的基础上,它是一种信号机制。程序员可以通过提供事件处理程序为相应的时间添加可执行代码。当事件触发时,将调用改时间事先定义的方法。

2.2.1声明

事件是一种特殊类型的委托,它包含两个参数:指示事件源的“对象源”(sender)参数和封装事件的其他任何相关信息的e参数。

事件的声明分为:(1)声明事件的委托;(2)声明事件的本身

2.2.2注册和移除

一个事件声明之后,改时间的默认值为null,如果希望该事件执行事先指定的操作,则首先向该事件注册方法列表。注册事件可以使用“+=”运算符,同时我们也可以移除事件(使用“-=”运算符)

2.2.3调用

声明一个事件之后,如果没有向该事件注册方法那么该事件的值为空。因此在调用事件时,往往需要检查该事件是否为空。

通过下面一个例子我们来看看事件是如何使用的。

namespace 事件

{

//声明委托

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

class
Program

{

//声明一个事件

public
event EventHandler Print;

//声明一个方法

public
void Method1(object sender,
EventArgs e)

{

Console.WriteLine("方法F1()");

}

//声明一个方法

public
void Method2(object sender,
EventArgs e)

{

Console.WriteLine("方法F2()");

}

static
void Main(string[] args)

{

Program program =new
Program();

program.Print += new
EventHandler(program.Method1);  //注册Method1方法

program.Print += new
EventHandler(program.Method2);  //注册Method2方法

Console.WriteLine("事件中的方法列表:");

if (program .Print !=null)

{

program.Print(null,null);

}

Console.WriteLine("");

program.Print -= new
EventHandler(program.Method1);  //移除Method1方法

Console.WriteLine("移除方法Method1之后:");

if (program.Print !=
null)

{

program.Print(null,null);

}

Console.ReadKey();

}

}

}

运行结果:

时间: 2024-12-18 18:36:35

浅析C#---委托和事件的相关文章

C#高级知识点概要(1) - 委托和事件

作者:linybo 要成为大牛,必然要有扎实的基本功,不然时间再长项目再多也很难有大的提升.本系列讲的C# 高级知识点,是非常值得去撑握的,不仅可以让你写代码时游刃有余,而且去研究和学习一些开源项目时,也不会显得那么吃力了. 希望大家记住,这里讲的所有的知识点,不仅仅是了解了就可以了,还要会灵活用,一定要多思考,撑握其中的编程思想. 本文讲的是委托和事件,这两个词可能你早就耳熟能详,但你是否真正撑握了呢? 本系列讲的C#高级知识点都是要求开发时能达到可以徒手写出来的水平(不依赖搜索引擎.找笔记等

委托与事件

委托在底层就是一个函数的指针,委托是事件的基础. 你可以传递引用类型.值类型.但是你有没有需要传一个方法呢?传方法的过程就是委托. 消息类: public class Message { /// <summary> /// 传引用类型 /// </summary> /// <param name="msg"></param> public static void Send(string msg) { Console.WriteLine(&

C#学习(一):委托和事件

预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说,在这种模式中,发布者定义了一系列程序的其他部分可能感兴趣的事件.其他类可以"注册",以便再这些事件发生时发布者可以通知它们.这些订阅者类通过向发布者提供一个方法来"注册"以获取通知.当事件发生时,发布者"触发事件",然后执行订阅者提交的所有事件.

C#中委托和事件

目 录 1.1 理解委托 2 1.1.1 将方法作为方法的参数 2 1.1.2 将方法绑定到委托 4 1.2 事件的由来 6 1.2.1 更好的封装性 6 1.2.2 限制类型能力 9 1.3 委托的编译代码 10 1.4 .NET 框架中的委托和事件 11 1.4.1 范例说明 11 1.4.2 Observer 设计模式简介 12 1.4.3 实现范例的Observer 设计模式 13 1.4.4 .NET 框架中的委托与事件 14 1.5 委托进阶 16 1.5.1 为什么委托定义的返回值

C#委托和事件定义和使用

委托 定义委托的语法和定义方法比较相似,只是比方法多了一个关键字delegate ,我们都知道方法就是将类型参数化,所谓的类型参数化就是说该方法接受一个参数,而该参数是某种类型的参数,比如int.string等等:而委托是将方 法参数化,说了上面的那个类型参数化之后,相信你也能猜到方法参数化的意思了,对,就是将方法作为一个参数传到一个委托中. 首先来看看声明委托的语句: public deletate void MyDelegate(); public:访问修饰符  delegate:关键字 

[转载]C#深入分析委托与事件

原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 引言 本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Deleg

[转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委托是一个类型,是一个函数指针类型,这个类型将该委托的实例化对象所能指向的函数的细节封装起来了,即规定了所能指向的函数的签名,也就是限制了所能指向的函数的参数和返回值.当实例化委托的时候,委托对象会指向某一个匹配的函数,实质就是将函数的地址赋值给了该委托的对象,然后就可以通过该委托对象来调用所指向的函

C#语法之委托和事件

从大学就开始做C#这块,也做C#几年了,最近又从ios转回.Net,继续做C#,之前也没有写博客的习惯,写博客也是从我做ios的时候开始的,现在既然又做回了.net,那就写点关于.Net的博客,可能在大牛眼里这些都是简单基础的,不过回过头看我当时初学的时候觉得委托事件是不容易理解的,我这里也是想着联系着OC,两者有比较的学习下.毕竟都是面向对象语言,思想是相通的. 委托在OC中类似block,都是指向一个函数,其实他没和C++的函数指针类似.但委托还是和函数指针不太一样,委托是完全面向对象的,是

C#综合揭秘——深入分析委托与事件

本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单.在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用.最后一节,将介绍Predicate<T>.Action<T>.Func<T,TResult>多种泛型委托的使用和Lamb