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 采用委托变量(参数列表)这种形式,让事件执行方法

相关推荐

  1. C#delegateevent他们区别

    2024-04-24 05:42:01       11 阅读
  2. C# action,delegate,func用法区别

    2024-04-24 05:42:01       29 阅读
  3. DELETE、TRUNCATE DROP 在MySQL区别使用示例

    2024-04-24 05:42:01       20 阅读
  4. c/c++】cpp对c增强 delete delete []区别

    2024-04-24 05:42:01       16 阅读
  5. MySQLdrop、truncatedelete区别

    2024-04-24 05:42:01       15 阅读
  6. OracleTRUNCATE TABLE DELETE区别

    2024-04-24 05:42:01       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-24 05:42:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-24 05:42:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-24 05:42:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-24 05:42:01       18 阅读

热门阅读

  1. docker swoole+php8.2

    2024-04-24 05:42:01       11 阅读
  2. linux复习提纲

    2024-04-24 05:42:01       11 阅读
  3. 如何在 Ubuntu 上启用 IPv6

    2024-04-24 05:42:01       12 阅读
  4. 十几个好用的学习以及AI网站

    2024-04-24 05:42:01       13 阅读
  5. python使用selenium如何获取一个div下所有的文本

    2024-04-24 05:42:01       11 阅读
  6. AlgorithmDay20

    2024-04-24 05:42:01       11 阅读
  7. 再谈癌症基础与转化研究中的大数据科学

    2024-04-24 05:42:01       13 阅读
  8. 华为OD机试C++ - 最小循环子数组

    2024-04-24 05:42:01       12 阅读
  9. rk3568死机调试

    2024-04-24 05:42:01       15 阅读