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

为什么要使用委托(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被执行");
    }
}



相关文章

为什么湿气重的人容易胖(湿气是如何一步步让你变胖的)

众所周知,我是一个温柔善良的美男子;也是一个没得感情的脂肪杀手。最近这段日子,我的敌人很嚣张,它的名字叫做:湿气。所以我打算曝光它,告诉大家:湿气是怎么让你变胖的,好让大家提高警惕。先给大家说一下我最近消灭脂肪的一个案例吧。01事发在5月初一个风和日丽的下午。门诊有个90后女士找我报案,控诉湿气让她

2025-05-19 17:59:35

建筑为什么退让用地红线5米(建筑退让要求)

一、(建筑退让道路红线的距离)临城市道路新建、改建、扩建的建筑,不得超越建筑控制线,其退让道路红线的最小距离,应当符合下表规定:新建剧院、游乐场、体育场(馆)、展览馆、会展中心、大型商场、大型旅馆、大型医院、中小学校等有大量人流、 车流集教的建筑,其临城市道路的主要出入口退让道路红线的最小退让距离不

2025-05-19 16:49:42

买房为什么要付全款(到底要不要“全款买房”?)

到底要不要“全款买房”?内行人道出实情,全款和贷款的差别很大虽然没有规定一个人必须要买房子,但在中国家庭的固有印象当中:想要组建一个新的家庭,就要有一套房子。房子并不是生活的唯一条件,然而孩子上学或者是落户,都需要有固定的住所,都需要有房子。有些朋友觉得要买房的话,就全款直接一次性付清所有的还款,后

2025-05-19 16:32:20

喜鹊为什么撞窗户解释(鸟为什么会撞上建筑物)

眼下,正是候鸟迁徙的时候。前不久,近千只鸟在撞上美国芝加哥麦考密克展览中心的窗户后死亡。这座大楼外墙大部分被玻璃覆盖。那么,鸟为什么会撞上建筑的玻璃幕墙?如何避免发生此类事件?科技日报记者就此采访了相关专家。“这种鸟撞击人类建筑物引起的事故有个专有名词――鸟撞。”科普作家李维阳在接受科技日报记者采访

2025-05-19 15:56:36

水泥台阶为什么开裂(混凝土构筑物裂缝原因)

构筑物楼板裂纹的原因:1、地勘报告不准确,设计不当等原因,基础出现不均匀沉降。2、混凝土配合比计量控制不当,骨料集配、含泥量不合格等原因。3、混凝土塌落度不当,现场加水,混凝土出厂时间多长出现离析分层。4、模板支撑体系不符合方案要求,整体刚度不足,局部变形出现裂缝。5、模板浇筑前,垃圾未清理、夹杂,

2025-05-19 15:29:34

为什么橡木家具要拼接(橡木家具好不好?)

橡木家具是实木家具里的一种。在人们的意识里,实木家具似乎是最好的。事实上真如此吗?下面我们一起来看下橡木家具怎么样?到底好不好?橡木家具顾名思义是实用橡木作为材料的家具。橡木家具又分为纯橡木家具和仿橡木家具。纯橡木家具所用用材都是橡木,包括桌面、衣柜的门板、侧板等均用纯橡木制成。纯橡木家具对于工艺以

2025-05-19 15:25:02