C#中的delegate和event作用及区别

本文介绍了C#中的委托(delegate)和事件(event),强调它们在类型安全和面向对象特性上的优势。委托作为方法的引用,支持单播和多播形式,允许绑定匿名和lambda表达式。事件则是一种特殊的委托,具有订阅和触发的限制,主要用于控件事件处理。文章对比了两者之间的主要区别,并提供了MSDN官方指南和示例代码链接。
摘要由CSDN通过智能技术生成

Delegate

delegate是C#中很重要的语法。
委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。
声明了delegate的属性都会继承自Delegate类。
使用单播委托类似C和C++的函数指针,但委托是面向对象和类型安全的(封装成delegate对象)。
使用多播委托类似观察者模式(发布/订阅模式)。实际上源码使用得最多的也是多播模式。但委托的通知实现方法绑定是基于函数签名(duck type)而非接口。相比传统的观察者模式实现更加灵活,有点像guava的Eventbus,而且实现更加优雅。
delegate不仅可以绑定外部方法,内部方法,静态方法。还能绑定匿名委托和lambda函数。可以使用 “=” 赋值委托方法,也可以使用“+=”和“-=”添加和去除委托方法。使用非常灵活方便。例子:

using System;
using System.Xml.Serialization;

namespace TestDelegateAndEvent
{
   

    class TestDelagateAndEvent
    {
   

        public static void innerStaticSayHello(String name)
        {
   
            Console.WriteLine($"innerStaticSayHello:hello {name}");
        }

        public void innerSayHello(String name)
        {
   
            Console.WriteLine($"innerSayHello:hello {name}");
        }

        /*
         * 声明delegate 
         */
        public delegate void SayHelloDelegate(String name);

        /*
         * 声明delegate对象
         */
        public SayHelloDelegate sayHelloDelegate;

        public event SayHelloDelegate sayHeloEvent;

        public void activateSayHelloDelegate(String name)
        {
   
            sayHelloDelegate?.Invoke(name);
        }

        public void activateSayHelloEvent(String name)
        {
   
            sayHeloEvent?.Invoke(name);
        }


    }
    class Test
    {
   
        public static void outerSayHello(String name)
        {
   
            Console.WriteLine($"outerSayHello:hello {name}");
        }
        static void Main(string[] args)
        {
   
            TestDelagateAndEvent obj = new TestDelagateAndEvent();

            /*
             * test delagate
             */
            //delegate 能使用 "="
            obj.sayHelloDelegate = obj.innerSayHello;
            obj.sayHelloDelegate += TestDelagateAndEvent.innerStaticSayHello;
            obj.sayHelloDelegate += Test.outerSayHello;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值