布条百科 - 专业百科知识分享的网站 手机版
首页 > 百科 >

为什么要使用委托(C#入门篇章—委托)

100次浏览     发布时间:2025-03-06 08:32:11    



C#委托



1. 委托的定义和使用

  • 委托的作用:如果要把方法作为函数来进行传递的话,就要用到委托。委托是一个类型,这个类型可以赋值一个方法的引用。C#的委托 通过 delegate 关键字来声明。
  • 声明委托的方式:
    // 第一种方式
    delegate void MyDelegate_1(int x);
    // 第二种方式
    delegate void MyDelegate_2<T>(T x);
  • 使用委托的方式:
    // 第一种方式
    MyDelegate_1 mydelegate = new MyDelegate_1( func );
    // 第二种方式
    MyDelegate_1 mydelegate = func;
委托调用方法
// 例子
public class Delegate : MonoBehaviour
{
 public delegate void ShowDelegate();
 public delegate double MultiplyDelegate(double x, double y);
 void Start()
    {
 ShowDelegate show = new ShowDelegate(Show_1);
 MultiplyDelegate mul = Multiply;
 // 直接调用
 show();
 Debug.Log(mul(2f, 3f));
 // 调用invoke方法
 show.Invoke();
 Debug.Log(mul.Invoke(2f, 3f));
    }
 public void Show_1()
    {
 Debug.Log("Show1");
    }
 public double Multiply(double x, double y)
    {
 return x * y;
    }
}

2. 系统内置Action委托

Action委托:

  • Action<T>
  • 是 .NET Framework 内置的泛型委托,可以使用 Action<T>委托以参数形式传递方法,而不用显式声明自定义的委托。
  • 封装的方法必须与此委托定义的方法签名相对应。即 封装的方法必须具有一个通过值传递给它的参数,并且不能有返回值。 还有一种是非泛型委托 Action

注意:

  • Action
  • 委托至少 0 个参数,至多 16 个参数,无返回值;
  • Action
  • 表示无参,无返回值的委托;
  • Action<int, string>
  • 表示有传入参数intstring无返回值的委托;
  • Action<int, string, bool>
  • 表示有传入参数intstringbool无返回值的委托;
  • Action<int, int, int, int>
  • 表示有传入4个int型参数,无返回值的委托。
// 案例
// 使用Action、Func等委托时,需要添加 using System;
public class SystemAction : MonoBehaviour
{
    void Start()
    {
        // 无参
        Action action_1 = Show_1;
        action_1();

        // 带参
        Action<int, int> action_2 = Show_2;
        action_2(1, 2);

    }
    void Show_1()
    {
        Debug.Log("Show_1");
    }
    void Show_2(int a, int b)
    {
        Debug.Log("Show_2 " + (a + b));
    }
}

3. 系统内置Func委托

Func委托:Func是 .NET Framework 内置的带有返回类型的泛型委托

注意:

  • Func
  • 至少 0 个输入参数,至多 16 个输入参数,根据返回值泛型返回。必须有返回值,不可用void
  • Func<int>
  • 表示没有输入参数,返回值为int类型的委托;
  • Func<object, string, int>
  • 表示传入参数为objectstring,返回值类型为int的委托;
  • Func<T1, T2, T3, int>
  • 表示传入参数为T1, T2, T3(泛型),返回值为int类型的委托。
/**
 * System.Func 可以不带参数,但是必须带一个返回值
 * System.Func 若是调用的多个泛型的委托定义,最后参数的数据类型是函数的返回值类型,需要保持一致;
 * 非最后一个泛型的声明,需要与实现函数的参数个数及类型保持一致
 */
public class SystemFunc : MonoBehaviour
{
    void Start()
    {
        // 不带参数,返回值为string类型
        Func<string> func_1 = Show_1;
        string a = func_1();
        Debug.Log(a);
        // 带int类型参数,返回值为string类型
        Func<int, string> func_2 = Show_2;
        string b = func_2(100);
        Debug.Log(b);
        // 抛出异常FormatException: Input string was not in a correct format.
        /*Func<string, int > func_3 = Show_3;
        int c = func_3("s");
        Debug.Log(c);*/
    }
    string Show_1()
    {
        return "Show_1";
    }
    String Show_2(int a)
    {
        return a.ToString();
    }
    int Show_3(string x)
    {
        return int.Parse(x);
    }
}

4. 匿名方法、event事件、多播委托

匿名方法:没有名字的方法称之为匿名方法。

Event事件:Event事件本身就是一种委托,只是该委托只能作为类的成员,且不可在类外进行调用。

多播委托:在 C# 语言中,多播委托是指在一个委托中注册多个方法,在注册方法时可以在委托中使用加号运算符或者减号运算符来实现添加或撤销方法。

/**
 * 1. 匿名事件
 * 2. event事件
 * (1)event事件 只允许作为类的成员变量,且仅在类的内部使用才可以,外部不得直接调用
 * (2)当作为一个类的成员,event事件在外部类赋值时,只能通过 +=/-= 的方式;而对于普通的Action则可以 =/+=/-=的方式进行赋值
 * (3)可通过在类中定义方法调用event事件,外部类间接地调用这个方法来调用event
 * 3. 多播委托 += -=
 * 委托属于引用类型,引用类型的默认值为null,直接使用会报空异常;
 * 故在使用之前需要先判断委托对象(引用对象)是否为空
 */
public class MyEventClass
{
    public event Action action_3;
    public Action action_4;

    // event事件调用
    public void Send()
    {
        if(action_3 != null)
        {
            action_3();
        }
    }
}

public class Broadcast : MonoBehaviour
{
    // event事件
    event Action action_2;

    void Start()
    {
        // Action action = Show_1; 将该语句转为匿名
        Action action = delegate ()  // 匿名函数
        {
            Debug.Log("匿名函数被执行");
        };
        action();
        // 多播委托
        Action action_1 = Show_1;
        action_1 += Show_2;
        //action_1 -= Show_2;
        //action_1 -= Show_1;
        if (action != null)
        {
            action_1();
        }

        action_2 = Show_1;
        action_2();

        MyEventClass mEvent = new MyEventClass();
        mEvent.action_3 += Show_2;
        mEvent.Send();
        mEvent.action_4 = Show_2;
        mEvent.action_4();
    }
    void Show_1()
    {
        Debug.Log("Show_1被执行");
    } 
    void Show_2()
    {
        Debug.Log("Show_2被执行");
    }
}



相关文章

什么是银行黑户(这八种用卡行为将被列入银行黑名单!)

一、恶意透支非法占有信用卡信用额度,恶意刷卡不还,相当于犯罪。二、信用卡TX所谓的TX是指利用非正常手段制造虚假交易将信用卡额度内资金以现金方式套取。信用卡TX也是违法行为,会影响个人信用记录。三、逾期还款还款超过银行规定最后还款期限,导致不良信用记录。逾期还款6次就无法向银行申请贷款、信用卡。四、

2025-06-07 01:21:35

什么是生钱资产和耗钱资产(学会准确区分生钱资产和耗钱资产)

世界上那些中了彩票巨奖的人,大多数最后的生活都变得穷困潦倒,甚至不如从前。爸爸是亿万富翁,传到儿子、孙子基本就败光了,富不过三代。为什么会这样?到底是什么决定人生穷富?人生穷富的关键是什么?为什么穷人越来越穷,富人越来越富?是因为穷人和富人拥有的资产类型不同。资产的内涵是现金流,资产产生现金流的不同

2025-06-06 23:59:13

融资有什么要求吗(融资需要具备什么条件?)

没有这三点,就无法成为资本价值思维的开创者。如果这三点不完善,又怎么能获得融资呢?融资的基本条件是什么?我认为,融资的基本条件包括以下三点:·第一,人。一切都是人做的,创始人不行,一切都不行。什么样的人才真正具有价值呢?→首先,他们必须有超前的思维方式,能够想到别人想不到的东西,因为只有这样,才能从

2025-06-06 22:38:30

小额贷款要注意什么(申请小额信用贷款注意事项)

所谓小额信用贷款是以个人或家庭为核心的经营类贷款,其主要的服务对象为广大工商个体户、小作坊、小业主。贷款的金额一般为10万元以下,1000元以上。小额信用贷款是微小贷款在技术和实际应用上的延伸。借款人不需要提供担保。目前,不少家庭或是个人都喜欢选择小额信用贷款。那么申请小额信用贷款需要注意哪些事项呢

2025-06-06 21:58:35

p2p什么理财产品(P2P理财产品众多,哪一种网贷产品安全)

P2P网贷行业火爆,也衍生出了不同类型、不同风险系数的P2P理财产品,让网贷投资者目不暇接,甚至有点丈二和尚摸不着后脑,不知道该如何选择,笔者根据投资标的的内容和性质做了一下分类,让投资人从更清晰的角度选择安全,适合自己的网贷理财产品。网贷理财产品分类:目前市场上,P2P理财产品主要分成五类产品:票

2025-06-06 20:58:30

配资炒股什么意思(专业的股票配资炒股需要注意什么?)

专业的股票配资是指由具备相关证券从业资格、拥有专业投资管理经验、风险意识强、遵守法律法规等一系列条件的机构或个人,为投资者提供的股票杠杆交易服务。这种通常包括提供资金、交易平台、风险控制、交易指导等方面的支持和服务。专业的股票配资通常会提供较高的杠杆比例,使得投资者可以通过较少的资金参与更大的市场交

2025-06-06 20:05:31