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);

        }
    }
相关推荐
死磕音视频3 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
顽疲5 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
曹牧6 小时前
C#:输入的字符串格式不正确
c#
程序喵大人7 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)8 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的8 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质9 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
释厄6239 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_962885729 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python