C#委托与事件

委托

委托相当于一个list链表,把被委托的函数或者方法都连在一个链表中;

被委托的函数有一个特征:大家都有同样的返回值类型和参数类型;

为什么委托可以定一个委托对象:可以理解为委托是一个类型,即

delegate void f(int c);

f a;//定了一个委托对象委托对象实例化就相当于点燃了这个爆竹,被委托的函数都会运行,但只输出最后一个值;

cs 复制代码
using System;

namespace cs1
{
    
    class Program
    {
        public delegate int Callback(int x);
        static Callback c;
        static int Dou(int x)
        {
            return x * 2;
        }
        static int Mul(int x)
        {
            return x * x;
        }
        static void Main(string[] args)
        {
           
            Callback c = Dou;
            c += Mul;
            Console.WriteLine(c(4));
            Console.ReadLine();
        }
    }
}

输出16,可见虽然只输出最后一个值,但是进去的x经历了Dou和Mul,即会依次执行被委托的函数,这就是一个"点燃一个炮竹"的感觉;

要想看到这个"链表"中每一个函数方法执行的值,可以用这个foreach

cs 复制代码
using System;

namespace cs1
{
    
    class Program
    {
        public delegate int Callback(int x);
        static Callback c;
        static int Dou(int x)
        {
            return x * 2;
        }
        static int Mul(int x)
        {
            return x * x;
        }
        static void Main(string[] args)
        {
           
            Callback c = Dou;
            c += Mul;
            foreach (Delegate i in c.GetInvocationList())
            {
                Callback k = (Callback)i;
                Console.WriteLine(k(4));
            }
             //   Console.WriteLine(c(4));
            Console.ReadLine();
        }
    }
}

委托如何与方法联:

1)用类的:

cs 复制代码
using System;

namespace cs1
{
    public delegate int Callback(int x);//这里的public可以省略
    class Double
    {
        public int dou(int x)//这里的oublic必须要,不然访问不了,因为跟C++类一样就是不写有一定的保护级别
        {
            return x * 2;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Double d= new Double();//因为有类,因为要调其中的方法,故要搞一个对象
            Callback c = new Callback(d.dou);//委托的对象
            Console.WriteLine(c(4));//委托对象实例化就可以有值出现
        }
    }
}

2)不用类:

cs 复制代码
using System;

namespace cs1
{
    
    class Program
    {
        public delegate int Callback(int x);
        static Callback c;
        static int Dou(int x)
        {
            return x * 2;
        }

        static void Main(string[] args)
        {
           
            c += Dou;//Callback c = Dou;
            Console.WriteLine(c(4));
            Console.ReadLine();
        }
    }
}

可以用+=,-=来处理委托"链表"中的函数方法;

这里的static用法:

为了确保静态委托能够引用方法,这些方法也必须是静态的,除非希望通过类的实例来引用这些非静态方法(如例1))。由于此例中委托对象c是静态的,所以方法Dou也应该是静态的,以确保它们可以被静态委托c引用。

还有必须把这些东西,委托,函数方法,放进class program里,跟Main并排;

事件

就与类相关了,可以参考上面写的用类将委托与函数方法链接起来。

cs 复制代码
using System;

namespace cs1
{
    class Jiaf//甲方,给出委托事件
    {
        public delegate void Do();
        public event Do d;//委托事件对象
        public virtual void TriggerEvent()
        {
            d?.Invoke(); // 安全地调用事件,避免在事件为空时抛出异常  
        }
       public Jiaf() {
            Console.WriteLine("连接到甲方了");
        }
    }
    class Yif//乙方,执行委托事件
    {
        public void Y()
        {
            Console.WriteLine("连接到乙方了");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Jiaf j = new Jiaf();
            Yif y = new Yif();
            j.d += new Jiaf.Do(y.Y);
            j.TriggerEvent();//为了启动委托,gpt写的
            
            Console.ReadLine();
            
        }
    }
}

事件用到的一个例子,比如,博主发了动态,并且想给每个订阅者发送信息告知动态更新了,上面这个例子中,甲方就是博主,乙方是粉丝订阅者。(具体我不太清楚了qwq

相关推荐
Dovis(誓平步青云)4 分钟前
探索C++标准模板库(STL):String接口的底层实现(下篇)
开发语言·c++·stl·string
海棠一号8 分钟前
JAVA理论第五章-JVM
java·开发语言·jvm
草莓熊Lotso37 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
海的诗篇_1 小时前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript
cccc来财1 小时前
Go中的协程并发和并发panic处理
开发语言·后端·golang
狐凄1 小时前
Python实例题:Python计算线性代数
开发语言·python·线性代数
惊鸿一博2 小时前
java_网络服务相关_gateway_nacos_feign区别联系
java·开发语言·gateway
Bruce_Liuxiaowei2 小时前
深入理解PHP安全漏洞:文件包含与SSRF攻击全解析
开发语言·网络安全·php
成工小白2 小时前
【C++ 】智能指针:内存管理的 “自动导航仪”
开发语言·c++·智能指针
sc写算法2 小时前
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
开发语言·c++·json