C# 委托 delegate

目录

委托是什么

基本语法

定义自定义委托

委托常用在:

系统定义好的委托


委托是什么

委托是 函数(方法)的容器

可以理解为表示函数(方法)的变量类型

用来 存储、传递函数(方法)

委托的本质是一个类,用来定义函数(方法)的类型(返回值和参数的类型)

不同的 函数(方法)必须对应和各自"格式"一致的委托

基本语法

关键字 : delegate

语法:访问修饰符 delegate 返回值 委托名(参数列表);

写在哪里?

可以申明在namespace和class语句块中

更多的写在namespace中

简单记忆委托语法 就是 函数申明语法前面加一个delegate关键字

定义自定义委托

访问修饰默认不写 为public 在别的命名空间中也能使用

private 其它命名空间就不能用了

一般使用public

申明了一个可以用来存储无参无返回值函数的容器

这里只是定义了规则 并没有使用

delegate void MyFun();

委托规则的申明 是不能重名(同一语句块中)

表示用来装载或传递 返回值为int 有一个int参数的函数的 委托 容器规则

public delegate int MyFun2(int a);

委托是支持 泛型的 可以让返回值和参数 可变 更方便我们的使用

delegate T MyFun3<T, K>(T v, K k);

委托常用在:

//1.作为类的成员

//2.作为函数的参数

class Test

{

public MyFun fun;

public MyFun2 fun2;

public Action action;

public void TestFun( MyFun fun, MyFun2 fun2 )

{

//先处理一些别的逻辑 当这些逻辑处理完了 再执行传入的函数

int i = 1;

i *= 2;

i += 2;

//fun();

//fun2(i);

//this.fun = fun;

//this.fun2 = fun2;

}

增

public void AddFun(MyFun fun, MyFun2 fun2)

{

this.fun += fun;

this.fun2 += fun2;

}

#endregion

删

public void RemoveFun(MyFun fun, MyFun2 fun2)

{

//this.fun = this.fun - fun;

this.fun -= fun;

this.fun2 -= fun2;

}

系统定义好的委托

使用系统自带委托 需要引用using System;

无参无返回值

Action action = Fun;

action += Fun3;

action();

可以指定返回值类型的 泛型委托

Func<string> funcString = Fun4;

Func<int> funcInt = Fun5;

可以传n个参数的 系统提供了 1到16个参数的委托 直接用就行了

Action<int, string> action2 = Fun6;

可以穿n个参数的 并且有返回值的 系统也提供了 16个委托

Func<int, int> func2 = Fun2;


cs 复制代码
class Mother
{
    public void DoFood()
    {
        Console.WriteLine("妈妈做饭");
        Console.WriteLine("妈妈饭做好了");
    }
    public void Eat() 
    {
        Console.WriteLine("Mother吃饭");
    }
}
class Father
{
    public void Eat()
    {
        Console.WriteLine("Father吃饭");
    }
}
class Son
{
    public void Eat()
    {
        Console.WriteLine("Son吃饭");
    }
}



    class Program
    {
        public static void Main()
        {
        Action action=null;
        Mother mother= new Mother();
        Father father = new Father();
        Son son = new Son();
        action += mother.DoFood;
        action += son.Eat;
        action += mother.Eat;
        action += father.Eat;
        action();

        }
    }

cs 复制代码
using System.Collections;
using System.Linq;


class Monster
{
    public Action Action;

    public void Dead()
    {
        if (Action != null)
        { 
             Action();
        }
        Action = null;
    }
}
class Player
{
    public  int money;
    public void AddMoney()
    {
        money =money + 10;
    }
}
class Scene
{
    public void UpDate()
    {
        Console.WriteLine("界面数据刷新");
    }
}
class Achievement
{
    public int KillsNum;
    public void AddKillsNum()
    {
        KillsNum++;
    }
}



    class Program
    {
        public static void Main()
        {
         Achievement achievement = new Achievement();
        Monster monster = new Monster();
        Player player = new Player();   
        Scene scene = new Scene();
        monster.Action += achievement.AddKillsNum;
        monster .Action += player.AddMoney;
        monster.Action += scene.UpDate;

        monster.Dead();

        Console.WriteLine("玩家金币{0} 击杀数目前是{1} ", player.money, achievement.KillsNum);

        }
    }
相关推荐
星恒讯工业路由器4 分钟前
工业网络设备选型:导轨式、机架式与车载式的部署差异
开发语言·网络·数据库·php·工业路由器·导轨式·车载式
2601_962885725 分钟前
如何用 Python 把多只股票对齐成一张宽表?
开发语言·python
蹊黎3 小时前
C++中vector类的部分简单实现
开发语言·c++·visual studio
程序猿追9 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓9 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播9 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
墨云安全10 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
摇滚侠10 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y10 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
jimy112 小时前
c++的 Type Traits (一)
开发语言·c++