C#中委托和事件的区别实例解析

C#委托事件区别 事件就是委托属性啊,有个addremove以及一个私有委托 很多人说:“总是感觉委托事件没什么区别,调用事件不就是相当于调用多个委托么?” 不全对,事件之于委托,就相当于,集合的属性之于集合的元素,注意:事件封装了一层,事件其实就是一个特殊的多播委托 class Program { public delegate void SendHandler(string str); public e... 阅读详情

本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用。具体如下:
大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。
一、通过委托执行方法

class Program
{
    static void Main(string[] args)
    {
      Example example = new Example();
      example.Go();
      Console.ReadKey();
    }
}
public class Example
{
    public delegate void DoSth(string str);
    internal void Go()
    {
      //声明一个委托变量,并把已知方法作为其构造函数的参数
      DoSth d = new DoSth(Print);
      string str = "Hello,World";
      //通过委托的静态方法Invoke触发委托
      d.Invoke(str);
    }
    void Print(string str)
    {
      Console.WriteLine(str);
    }
}

上述代码实现:
① 在CLR运行时,委托DoSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。
② 委托DoSth定义了方法的参数和返回类型
③ 通过委托DoSth的构造函数,可以把符合定义的方法赋值给委托
④ 调用委托的实例方法Invoke执行了方法
但实际上让委托执行方法还有另外一种方式,那就是:委托变量(参数列表)

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    internal void Go()
    {
      //声明一个委托变量,并把已知方法作为其构造函数的参数
      DoSth d = new DoSth(Print);
      object sender = 10;
      EventArgs e = new EventArgs();
      d(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}

上述代码实现:
① 委托DoSth的参数列表和方法Print的参数列表还是保持一致
② 委托DoSth中的参数object sender通常用来表示动作的发起者,EventArgs e用来表示动作所带的参数。
而实际上,委托变量(参数列表),事件就是采用这种形式执行方法的。
二、通过事件执行方法

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    public event DoSth myDoSth;
    internal void Go()
    {
      //声明一个委托变量,并把已知方法作为其构造函数的参数
      DoSth d = new DoSth(Print);
      object sender = 10;
      EventArgs e = new EventArgs();
      myDoSth += new DoSth(d);
      myDoSth(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}

上述代码实现:
① 声明了事件myDoSth,事件的类型是DoSth这个委托
② 通过+=为事件注册委托
③ 通过DoSth委托的构造函数为事件注册委托实例
④ 采用委托变量(参数列表)这种形式,让事件执行方法
而且,通过+=还可以为事件注册多个委托。

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    public event DoSth myDoSth;
    internal void Go()
    {
      //声明一个委托变量,并把已知方法作为其构造函数的参数
      DoSth d = new DoSth(Print);
      DoSth d1 = new DoSth(Say);
      object sender = 10;
      EventArgs e = new EventArgs();
      //为事件注册多个委托
      myDoSth += new DoSth(d);
      myDoSth += new DoSth(d1);
      myDoSth(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
    void Say(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}

以上,通过+=为事件注册1个或多个委托实例,实际上,还可以为事件直接注册方法。

public class Example
{
    public delegate void DoSth(object sender, EventArgs e);
    public event DoSth myDoSth;
    internal void Go()
    {
      object sender = 10;
      EventArgs e = new EventArgs();
      //为事件注册多个委托
      myDoSth += Print;
      myDoSth += Say;
      myDoSth(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
    void Say(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}  

三、通过EventHandler执行方法
先来看EventHandler的源代码。
?
1
public delegate void EventHandler(object sender, System.EventArgs e);
可见,EventHandler就是委托。现在就使用EventHandler来执行多个方法。

public class Example
{
    public event EventHandler myEvent;
    internal void Go()
    {
      object sender = 10;
      EventArgs e = new EventArgs();
      //为事件注册多个委托
      myEvent += Print;
      myEvent += Say;
      myEvent(sender, e);
    }
    void Print(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
    void Say(object sender, EventArgs e)
    {
      Console.WriteLine(sender);
    }
}

总结:
① 委托就是一个类,也可以实例化,通过委托的构造函数来把方法赋值给委托实例
② 触发委托有2种方式: 委托实例.Invoke(参数列表),委托实例(参数列表)
③ 事件可以看作是一个委托类型的变量
④ 通过+=为事件注册多个委托实例或多个方法
⑤ 通过-=为事件注销多个委托实例或多个方法
⑥ EventHandler就是一个委托
相信本文所述对大家C#程序设计的学习有一定的借鉴价值。

C#委托事件区别 C#委托delegate(Action、Func、lamda表达式)、事件 阅读详情

相关推荐

事件(event)委托(delegate)的综合运用实例(WinForm控件事件执行流程原理),EventHandler委托

前言 关于委托前面已经写了: C#委托(delegate)多播委托的理解 ActionFunc泛型委托委托,泛型,匿名函数,Lambda表达式的综合使用 其实初衷是为了解WinFrom中的控件或者COM组件中的各种事件运行的机制,里面涉及的知识整理起来还是比较多的,各种类型的委托事件泛型等。 这里先整理事件(event),然后通过几个实例了解架构中的事件从激活到调用回调函数的具体过程...

define_LIN的博客 3964

C# 委托详解

C#委托也叫代理,委托提供了后期绑定机制(官方解释),功能类似于C++中的函数指针,它存储的就是一系列具有相同签名返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。

ellis1970的博客 1932

C#事件(event)解析

事件(event)   事件类似于异常,因为它们都是由对象引发(抛出),我们可以提供代码来处理事件。单它们也有区别,最重要的区别是并没有与try...catch 类似的结构来处理事件,而必须订阅(subscribe)它们。订阅一个事件的含义是提供代码,在事件发生时执行这些代码,它们称之为事件处理程序。所以在实际编程中,就必须有时间发生者时间处理者,初次之外还有它们活动的平台。事件发生者

liuguobo的专栏 5912

C#委托

C#中的委托是一个类型,它描述了一个方法的签名,即方法的参数类型返回类型。委托可以看作是一个指向方法的引用,使得我们可以像使用函数指针一样调用这些方法。 将一个或多个方法作为参数传递给另一个方法,从而在需要时调用这些方法。 实现事件处理程序。 实现回调方法。 实现异步编程等功能。 委托类一样,是一种用户定义类型。但类表示的是数据方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。可以通过一下操作步骤来使用委托

互联网底层民工的博客 1万+

委托事件

应用程序必须暂停它当前正在做的事情,转为处理另一个任务,任务完成之后,程序可以从当初暂停的地方恢复执行。这正是事件委托的用途。 委托是指向一个方法的指针,而且我们采取调用方法一样的方式来调用它。调用一个委托时,”运行时“实际执行的是委托所引用的方法。可以动态的更改一个委托所引用的方法,事调用一个委托的代码每次都运行一个不同的方法。委托的优势是能引用多个方法。 每个方法都具有相同的形式;它们都不...

weixin_42974146的博客 2548

C# delegate委托 event事件 区别

转载:https://blog.csdn.net/lrfleroy/article/details/88780590 C# delegate委托 event事件区别 理解: 1、区别: (1)delegate委托event事件不是一个层面的东西,delegate用来声明委托类型,event用来声明委托对象(此时委托对象就是事件)。 (2)事件委托的一种应用,事件是带有event关键...

gubaofu的博客 950

C# 委托?这篇文章让你困惑全摆脱!

作者|羽生结弦 责编 | 胡雪蕊 出品 |CSDN(CSDNnews) 在C#中的委托关键字是 Delegate,委托类似于C/C++中函数的指针。是存有对某个方法引用的引用类型变量,可在运行时被改变。一般用于实现事件回调方法。 注意:所有的委托都派生自 System.Delegate 类委托分为委托类型委托实例,下面分别进行讲解。 零、委托类型委托实例 ...

CSDN资讯 2984

C# 中的委托事件(详解:简单易懂的讲解)

https://blog.csdn.net/lizhenxiqnmlgb/article/details/82141968 本文转载自 http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html C# 中的委托事件(详解) https://www.cnblogs.com/newcapecjmc/p/7084026.html 基础:https://www.cnblogs.com/hongfei/p/3574239.html ..

zunguitiancheng的专栏 2907

.Net中的委托事件(DelegateEvent)

委托 委托的简单运用 一个委托类型定义了该类型的实例能调用的一类方法,这些方法含有同样的返回类型同样的参数(形参个数相同)。委托接口一样,可以定义在类的外部。如下定义的一个委托类型 - Calculator: delegate int Calculator (int x); 此委托适用任何有着 int 返回类型一个 int 类型参数的方法、如: static int Double ...

weixin_43965881的博客 1020

C# 中的委托事件(详解,附实例

C# 中的委托事件 1引言 委托事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托事件对很多接触C#时间不长的人来说并不容易。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托事件的由来。.Net Framework中的委托事件委托事件对Observer设计模式的意义,对它们的中间代码也做了讨论。 2将方法作为方法的参数 首先来看看下面

彼岸花 1467

Event事件与普通委托对象的区别

委托:public delegate void WeiTuo(); 经event关键字修饰的委托实例:public event WeiTuo WeiTuoEvent; 普通委托实例:public form2WeiTuo WeiTuoNorm; 经event修饰的委托实例,其访问权限较普通委托实例低,只可在本类之中进行invoke调用。 我看许多人说经event修饰的委托实例可以进行多播,也就是...

Learn_change_myself的博客 331

委托事件区别

首先,我们知道委托事件都可以用来调用跟自己方法签名一样的方法。容易混淆大家的地方大多在于这两者之间的区别。从我们使用委托delegate事件event上的主要有两大区别(如表1所示)。                           表1 委托事件区别 序号 区别 委托 事件 1 是否可以使用=来赋值 是 否 2 是否可以在类外部进...

lxrj2008的专栏 433

C#下函数,委托事件的一点理解!

今天一来是有点空,二来是在博客上偶然看到有关于委托的文章,一时兴起,就自己也写一点心得与大家分享一下。 先看一个例子: usingSystem;namespaceConsoleApplication1{classClass1{[STAThread]staticvoidMain(string[]args){...

weixin_30566149的博客 91

C#高级编程读书——委托,Lamda表达式,事件

委托是寻址方法的.Net版本,在C++中,函数指针是指向内存位置的指针,是类型不安全的。 委托是类型安全的类,定义了返回类型参数的类型。 包含对一个方法或多个方法的引用。 委托将方法作为参数传递给另一个方法。 应用场景: 启动线程任务 通用库类 事件 声明委托: delegate void ADelegateSample(int x); //该委托实例可以包含一个方法的引...

u014626607的博客 206

c#的delegateevent

delegate是什么 委托(delegate) 是存有对某个方法的引用的一种引用类型变量,引用可在运行时被改变。如果不好理解,可以把委托理解成为函数指针,但它们是有区别的。 delegateC++中的函数指针: 函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引 用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了...

linxinfa的专栏 2742
上一篇: Tasharen Fog of War v1.0战争迷雾插件的使用(含Unity5.0Bug解决)
下一篇: Unity设计模式之简单工厂模式
Makcy_
博客等级 码龄12年 6粉丝 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值