C#中的delegate和event,及他们的区别

简述:

delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。委托也成就之后的匿名函数和Lambda表达式。

event就是由某个对象发出的消息,这个消息标志着某个特定的行为发生了,或者某个特定的条件成立了。比如用户点击了鼠标、socket上有数据到达等。那个触发(raise)事件的对象称为事件的发送者(event sender),捕获并响应事件的对象称为事件的接收者(event receiver)。C#中事件的实现依赖于delegate,C#中的事件处理实际上是一种具有特殊签名的delegate,是一种封装过的delegate

事件和委托的区别

1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用

2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。
    
    delegate的使用案例

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

上面使用详解:

1、 在CLR运行时,委托FunSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。
2、委托FunSth定义了方法的参数和返回类型
3 、通过委托FunSth的构造函数,可以把符合定义的方法赋值给委托
4 、调用委托的实例方法Invoke执行了方法
event的使用案例

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

上面的使用详解

1 声明了事件FunSth,事件的类型是FunSth这个委托

2 通过+=为事件注册委托

3 通过FunSth委托的构造函数为事件注册委托实例

4 采用委托变量(参数列表)这种形式,让事件执行方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值