快速理解C#中的委托与事件

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

以下内容只是个人理解,仅供参考。

什么是委托?

先看最简单的委托例子:

namespace DelegateTest
{
    public delegate void MessageDelegate(string name);
    class Program
    {
        private static void SaySomething(string name)
        {
            Console.WriteLine("You said " + name);
        }
        static void Main(string[] args)
        {
            MessageDelegate msgDelegate = new MessageDelegate(SaySomething);
            msgDelegate("Hello");
            Console.ReadKey();
        }
    }
}

输出结果为:You said Hello

从代码中我们可以看到,SaySomething是一个方法,delegate是一个类。

通俗的来说,委托是方法的容器,就像数组string[]string变量的容器。

如返回值void类型和接收string类型参数的委托对象只能绑定同样类型的方法。

MessageDelegate msgDelegate = new MessageDelegate(SaySomething);

这句代码是初始化委托对象,我们把SaySomething这个方法封装进去msgDelegate中。

它的构造方法必须要有1个方法作为参数才能初始化。

初始化一个委托对象也可以直接赋值一个方法初始化,:

MessageDelegate msgDelegate=SaySomething;

这个时候SaySomething方法已经装入了委托对象msgDelegate内,所以们可以通过调用委托对象来调用已装入的方法。

我们要使用的时候就把委托对象msgDelegate当做方法一样调用。


过程总结:

1.定义委托对象

public delegate void MessageDelegate(string name);

2.定义方法

 private static void SaySomething(string name)

        {

            Console.WriteLine("You said " + name);

        }

3.新建一个委托对象然后初始化

MessageDelegate msgDelegate = new MessageDelegate(SaySomething);

或者

MessageDelegate msgDelegate=SaySomething;

4.调用委托对象

msgDelegate(“Hello”);

 

以上是不带返回值的委托,如果要带返回值的委托可以自己制定:

public delegate int AddNumber(int a,int b);

  static void Main(string[] args)
        {
            AddNumber an= new AddNumber(MyFunc);
           Int n=an(1,2);
Console.WriteLine(n);
           Console.ReadKey();
        }
  private static int AddFunc(int a,int b)
        {
            return a+b;        
}

多路广播委托:

如果说委托对象是一个容器,那一个委托对象可以绑定多个方法。

很简单,我们使用+=来绑定更多的对象。

反之,我们可以用-=来取消绑定对象。


namespace DelegateTest
{

    class Program
    {
        public delegate void MessageDelegate(string name);
        private static void SaySomething(string name)
        {
            Console.WriteLine("You said " + name);
        }
        private static void SayAnything(string str)
        {
            Console.WriteLine(str);
        }
        static void Main(string[] args)
        {
            MessageDelegate msgDelegate = new MessageDelegate(SaySomething);
            msgDelegate += SayAnything;
            msgDelegate("Meh");
            Console.ReadKey();
        }
    }
}

 

输出结果为:

You said Meh

Meh

 

注意:委托对象的列表为空(null)的时候不能调用,但可以绑定或取消绑定对象。

 

既然委托对象是一个类,那么我们也可以把这个委托对象作为一个方法的参数来传递。

namespace DelegateTest
{

    class Program
    {
        public delegate void MessageDelegate(string name);
        private static void SaySomething(string name)
        {
            Console.WriteLine("You said " + name);
        }
           private static void SayAnything(MessageDelegate msgDelegate)
        {
            if(msgDelegate!=null)
            msgDelegate("Hello");
        }

        static void Main(string[] args)
        {
            MessageDelegate msgDelegate = new MessageDelegate(SaySomething);
            SayAnything(msgDelegate);
            SayAnything(SaySomething);
            msgDelegate.Invoke("xxx");
            msgDelegate("xxx");
            Console.ReadKey();
        }
    }
}

输出结果为:

You said Hello

You said Hello

xxx

xxx

 

我们用了4种不同的方法依次调用,第一个是传入一个委托对象,第二个是传入方法,第三个是直接调用委托,第四个和第三个是等价的。

由此可看出我们可以把方法作为参数传入一个委托对象类型来调用,也可以把一个装有方法的委托类型作为参数传递后调用。

 

总结:

委托对象是一个类,可以传递与委托对象返回值和形参相同的方法,然后去调用它。

委托可以绑定多个方法然后依次调用。

委托是函数指针,主要功能是用来实现类之间的交流和回调,就像你委托朋友帮你做一件事,你朋友会告诉你进度。

 

为什么要用委托?什么时候用委托?

看了上面的例子,大部分同学应该对委托大概有个理解了,可能有同学会问为什么不直接调用SaySomething而要通过委托对象间接调用,用了委托到底有什么好处,什么时候该用委托,其实从字面上委托的意思是两方交流的中介,比如中国和俄罗斯交流需要委托翻译来实现,接下来我们再看几个例子。

 

一、当你不确定使用具体方法的时候

比如你是一所幼儿园老师,你想奖励小朋友食物,有以下几种奖励:

private static void GiveLolipop()
        {
            //给了棒棒糖
            Console.WriteLine("给了棒棒糖");
        }
        private static void GiveCake()
        {
            //给了蛋糕
            Console.WriteLine("给了蛋糕");
        }
        private static void GiveSugar()
        {
            //给了糖果
            Console.WriteLine("给了糖果");
        }
        private static void GiveBiscuit()
        {
            //给了饼干
            Console.WriteLine("给了饼干");
        }

如果我们想给每个小孩定制一套奖励,可以定义多个方法实现

  private static void GiveChildren1()
        {
            GiveSugar();
            GiveBiscuit();
            GiveLolipop();
        }
        private static void GiveChildren2()
        {
            GiveSugar();
            GiveCake();
            GiveBiscuit();
        }
        private static void GiveChildren3()
        {
            GiveLolipop();
            GiveSugar();
            GiveCake();
        }

和使用enumswitch语句

public enum Children{
Jojo,Meme,Kiki
}

private static void GiveChildren(Children children)
{
 switch(children)
            {
                case Children.Jojo:
                    GiveChildren1();
                    break;
                case Children.Meme:
                    GiveChildren2();
                    break;
                        case Children.Kiki:
                    GiveChildren3();
                    break;
                default:
                    GiveSugar();
                    break;
            }
}

虽然这样做可以解决需求,但是扩展性非常差,我们想增加新的一套奖励就得增加新的方法和修改枚举类型和switch语句。

 

如果我们使用委托,则可以解决这个问题:

因为可以动态决定使用哪个方法,所以这里我们不需要枚举。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegateTest
{

    class Program
    {
        public delegate void RewardDelegate();

        static void Main(string[] args)
        {
            RewardDelegate rewardAll,reward1, reward2, reward3;
            rewardAll = GiveSugar;
            rewardAll += GiveBiscuit;
            rewardAll += GiveCake;
            rewardAll += GiveLolipop;
            reward1 = rewardAll - GiveCake;
            reward2 = rewardAll - GiveLolipop;
            reward3 = rewardAll - GiveBiscuit;
            GiveChildren("Jojo", reward2);
            Console.ReadKey();
        }
    
        private static void GiveLolipop()
        {
            //给了棒棒糖
            Console.WriteLine("给了棒棒糖");
        }
        private static void GiveCake()
        {
            //给了蛋糕
            Console.WriteLine("给了蛋糕");
        }
        private static void GiveSugar()
        {
            //给了糖果
            Console.WriteLine("给了糖果");
        }
        private static void GiveBiscuit()
        {
            //给了饼干
            Console.WriteLine("给了饼干");
        }
      
        private static void GiveChildren(string name,RewardDelegate rD)
        {
            if (rD != null)
            {
                Console.WriteLine("给" + name + "的奖励有:");
                rD.Invoke();
            }
        }
    }
}

运行结果如图:


这个例子可能举得不太好,但我们可以动态地决定使用哪个方法,代码也简洁了很多,让程序的扩展性更灵活。

所以委托可以让我们避免大量使用条件语句(if,switch),同时也可以避免代码的重复性。

 

如果还有同学不明白的话,我再举一个简单的例子。

假设你需要装修房子,你需要给装修工人一个装修方案,那么代码可以这么写:

 public delegate void DecorateDelegate();
        static void Main(string[] args)
        {
            DecorateHouse(ClassicStyle);
            Console.ReadKey();
        }
        private void ClassicStyle()
        {
            Console.WriteLine("你选择了经典装修方案");
        }
        private void DecorateHouse(DecorateDelegate dd)
        {
            if (dd != null)
                dd.Invoke();
        }

 

当你需要更改装修方案时你只需要更改DecorateHouse里的参数就可以了,操作起来简单很多。

 

二、当你需要实现两个类之间的沟通时

接下来我们再看最后一个例子:

namespace DelegateTest2
{
    class Program
    {
        static void Main(string[] args)
        {
            Myclass myClass = new Myclass();
            myClass.Working();
        }
    }
    class Myclass
    {
        public void Working()
        {
            for(int i=0;i<10000;i++)
            {
                //处理事件
            }
        }
    }
}


在这样一个例子中,如果Program类想在循环运行的时候想要实时获得MyclassWorking方法里的信息,我们可以使用委托来实现。

class Program
    {
       
        static void Main(string[] args)
        {
            Myclass myClass = new Myclass();
            myClass.Working(CallBack);
        }
        private static void CallBack(int i)
        {
            Console.WriteLine(i);
        }
    }
    class Myclass
    {
        public delegate void CallBack(int i);
        public void Working(CallBack callBack)
        {
            for(int i=0;i<10000;i++)
            {
                //处理事件
                callBack(i);
            }
        }
}

我们把Program类中的CallBack方法传入了Working方法中,由此得到回调。

简单来说就是就是MyClass使用了Program中的CallBack方法来输出信息。

别问我为什么不直接public static 然后直接调用,我们考虑的是对象的封装性。

 

程序运行结果如图:



总结:除了将方法作为参数传递外,委托的主要功能是实现两方之间的通讯,然后实现回调。

 

对于委托的深入理解

==================================================================

1.委托的协变与逆变

Framework 2.0前的版本,还没有委托协变的概念

举个例子:

    public class Human

      {.......}

      public class Man : Human

     {.......}

public delegate Human HumanHandler(int id);

  public delegate Man ManHandler(int id);

 

在这里HumanHandler是不能绑定返回值为Man的方法,因为它们被视为两个不同的类型,虽然Man继承至Human

 

而在Framework 2.0后的版本,有了委托协变的概念

我们可以直接绑定返回值为Man的方法:

HumanHandler hh=new HumanHandler(ManHandler);

Man man=hh as Man;

 

而委托逆变跟委托协变一样,唯一不同的是它以object作为参数的委托,然后再用is判断object的类型。

class Program
    {
        public delegate void Handler(object obj);

        public static void GetMessage(object message)
        {
            if (message is string)
                Console.WriteLine("His name is : " + message.ToString());
            if (message is int)
                Console.WriteLine("His age is : " + message.ToString());
        }

        static void Main(string[] args)
        {
            Handler handler = new Handler(GetMessage);
            handler(29);
            Console.ReadKey();
        }
   }

2.泛型委托

对于以上的方法,如果都以object作为参数,每次都要进行拆箱操作是非常消耗性能的,过程也很繁琐。

因此这里引入了泛型委托的概念。

  class Program
    {
        public delegate void Handler<T>(T obj);
        static void Main(string[] args)
        {
            Handler<int> handler1 = new Handler<int>(getSquare);
            Handler<string> handler2 = new Handler<string>(sayHi);
            handler1(2);
            handler2("Wix");
            Console.ReadKey();
        }
        static void getSquare(int a)
        {
            Console.WriteLine(a * a);
        }
        static void sayHi(string name)
        {
            
            Console.WriteLine("Hi,"+name);
        }
}

输出结果如图:

什么时候使用泛型委托?

如果你想绑定多个不同类型参数方法的话可以使用泛型委托,而且不需要用is进行类型判断。这样我们就可以不用定义多个不同参数类型的委托了。

什么是事件?

简单的来说,事件的由来是为了保证系统的封装性。

上面的代码可以看到委托的声明都是public,这使得外界可以直接进行调用或赋值操作。

如果设置成private,我们需要添加AddHandlerRemoveHandler方法(+=-=),就有如getset方法,很麻烦。

所以事件这个概念由此而生。

 

 public class EventTest
  {
      public delegate void MyDelegate();
      public event MyDelegate MyEvent;
   }
 


*事件对应的变量成员将会被视为 private 变量

 

如果不明白,可以想象事件是委托的容器,可以保证委托的封装性。

事件能通过+=-=两个方式注册或者注销对其处理的方法


public delegate void MyDelegate(string name);

    public class PersonManager
    {
        public event MyDelegate MyEvent;

        //执行事件
        public void Execute(string name)
        {
            if (MyEvent != null)
                MyEvent(name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            PersonManager personManager = new PersonManager();
            //绑定事件处理方法
            personManager.MyEvent += new MyDelegate(GetName);
            personManager.Execute("Leslie");
            Console.ReadKey();
        }

        public static void GetName(string name)
        {
            Console.WriteLine("My name is " + name);
        }
    }

我们也可以直接绑定方法

  personManager.MyEvent += GetName;

或者绑定匿名方法

 personManager.MyEvent += delegate(string name){

                 Console.WriteLine("My name is "+name);

             };

 

总结:事件就是一个特殊的委托。



什么时候用事件?

 

事件可以把逻辑流程拆分成几个阶段,在游戏中,如单位生产事触发某个事件,单位死亡时触发某个事件。

下面是模拟unity中的代码例子:

 class UnitHandler
    {

        public delegate void UnitEventHandler(GameObject unit);
        public static event UnitEventHandler onUnitSpawn;
        public static event UnitEventHandler onUnitDestroy;
        public static void NewUnitCreated(GameObject unit)
        {
            if (onUnitSpawn != null)
                onUnitSpawn(unit);
        }
        public static void UnitDead(GameObject unit)
        {
            if(onUnitDestroy!=null)
            onUnitDestroy(unit);
       
        }
}

 class UnitManager
    {
     public void OnEnabled()
        {
            UnitHandler.onUnitSpawn += this.NewUnitCreated;
        }
        public void NewUnitCreated(GameObject unit)
        {
            Console.WriteLine("unit created");
            Console.ReadKey();
        }

      public  void OnDisable()
        {
            UnitHandler.onUnitSpawn -= this.NewUnitCreated;
        }
    }

  class Program
    {
        static void Main(string[] args)
        {
            UnitManager um = new UnitManager();
            um.OnEnabled();
            UnitHandler.NewUnitCreated(new GameObject());
            um.OnDisable();
            UnitHandler.NewUnitCreated(new GameObject());
        }
    }

*这里的GameObject是一个空类

 

运行结果为:

unit created


事件可以在某件事件发生时让一个对象通知另一个对象,可以理解为监听某个事件,然后在特定条件下触发。

 

下面再看一个例子:

在我们创建一个事件之前,我们需要一个委托,而一般标准的委托声明如下:

    public delegate void EventHandler(object sender, System.EventArgs e);

第一个形参object sender定义了对象来源,第二个形参放的是继承自System.EventArgs的类,一般上这个类包含了事件的详细信息。

 

例子:

    class ButtonEventArgs:EventArgs

    {

        public string time;

 

}

 

在这里我们不需要传递什么事件信息,所以我们用基类EventArgs就好。

 public delegate void EventHandler(object sender, System.EventArgs e);

    class Publisher
    {
        public event EventHandler Added; //定义发生事件


        protected virtual void OnAdded(System.EventArgs e) //当事件发生中触发方法
        {
            if(Added!=null)
            {
                Added(this, e);
            }
        }
        public void Add(object value) //触发事件的方法
        {
   
            OnAdded(System.EventArgs.Empty);
        }
}



    class Subscriber
    {
        void AddedEventHandler(object sender,System.EventArgs e)
        {
            System.Console.WriteLine("AddEvent occured");
        }
        
        static void Main()
        {
            Subscriber s = new Subscriber();
            Publisher p = new Publisher();
            p.Added += s.AddedEventHandler;
p.Add(10);
        }
}


事件的使用步骤如下:

存放事件的类

1.定义事件

2.触发事件的方法(protected)

3.间接触发事件的方法(public)

 

触发事件的类

1.定义方法

2.注册方法

3.触发方法

 

再来看最后一个例子:


public class MyEventArgs : EventArgs
    {
        private string args;

        public MyEventArgs(string message)
        {
            args = message;
        }

        public string Message
        {
            get { return args; }
            set { args = value; }
        }
    }

    public class EventManager
    {
        public event EventHandler<MyEventArgs> myEvent;

        public void Execute(string message)
        {
            if (myEvent != null)
                myEvent(this, new MyEventArgs(message));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            EventManager eventManager = new EventManager();
            eventManager.myEvent += new EventHandler<MyEventArgs>(ShowMessage);
            eventManager.Execute("How are you!");
            Console.ReadKey();
        }

        public static void ShowMessage(object obj,MyEventArgs e)
        {
            Console.WriteLine(e.Message);
        }
    }

这里我们使用了EventHandler<TEventArgs> 构造出所需要的委托。

public delegate void EventHandler<TEventArgs> (Object sender, TEventArgs e)

 

MyEventArgs 负责存放事件信息。

EventManager负责事件的定义和执行。

Program 负责定义方法和事件的触发。

 

总结:

委托是派生自System.MultcastDelegate 的类,事件(Event)属于一种特殊的委托,它与委托类型同步使用。

 

 

本文章部分内容参考了此文章并加入了个人理解:

http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html


C#中的委托(Delegate)和事件 (Event)详解使用范例 阅读详情

相关推荐

C# 委托简述

使用关键字delegate声明委托除了使用delegate定义 委托以外C#提供两个定义好的泛型委托ActionFunc) (当然你也可以使用delegate自定义泛型委托)这里先介绍两个C#定义的委托,相信很多人都在使用,不管你清不清楚什么是委托Action:是无返回值的泛型委托。下面action 表示无参,无返回值的委托//定义委托action();//使用方式1//使用方式2Console.WriteLine("我是传入的无参无返回值的委托方法");

qq_44217121的博客 1686

C# 委托详解

C#委托也叫代理,委托提供了后期绑定机制(官方解释),功能类似于C++中的函数指针,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。

ellis1970的博客 1935

分分钟用上C#中的委托事件

每一个初学C#的程序猿,在刚刚碰到委托事件的概念时,估计都是望而却步,茫然摸不到头脑的。百度一搜,关于概念介绍的文章大把大把的,当然也不乏深入浅出的好文章。可看完这些文章,大多数新手,估计也只是信心满满的觉得自己看懂了,一旦要在自己的程序中用上委托事件,就傻眼了,根本不知道什么情况下该用,也不知道具体怎么用。 本文没有任何概念介绍,旨在帮助同学们快速用上委托事件,进入C#的更高境界。 ...

weixin_30684743的博客 2399

C#委托

C#中的委托是一个类型,它描述了一个方法的签名,即方法的参数类型和返回类型。委托可以看作是一个指向方法的引用,使得我们可以像使用函数指针一样调用这些方法。 将一个或多个方法作为参数传递给另一个方法,从而在需要时调用这些方法。 实现事件处理程序。 实现回调方法。 实现异步编程等功能。 委托和类一样,是一种用户定义类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。可以通过一下操作步骤来使用委托

互联网底层民工的博客 1万+

C#委托delegate事件event)的快速理解

具有返回值的委托类型,返回值默认是最后一个函数的返回值,就是最后添加的返回值。

s_156的博客 282

帮你理清C#委托事件、Action、Func

想要理清这些名词的区别,我们先搞清楚他们的关系。##第一步:所有的名词,都是基于委托产生的,所以这个委托其实就是基础,先要明白什么是委托委托的关键词是delegate ,具体在代码中的使用方法如下: 为了方便新人理解,这里我直接用通俗点点方式说一下什么是委托委托(delegate)其实就是函数的模版,这个模版可以用来放入各种格式和他相同的函数,也就是这些真实函数的引用,就好比你声明了一个i...

unityofficial的博客 121

十二月十四日(C#)(委托)

huozhehome键 把光标迅速移到最前面。end键是最后面 ctrl x剪切 class Program { int res = 0; static void Main(string[] args) { Program c = new Program(); int b = c.F(40);//C#对象对于引用非静态字段、方法或属性是必需的 //非静态类的方法不...

zaizai1007的博客 487

C#事件委托

委托是一种类型安全的方法引用,允许将方法作为参数传递。事件是一种基于委托的通知机制,适用于实现观察者模式。委托事件C#中广泛用于异步编程、事件驱动编程等场景。

m0_73727069的博客 1769

快速理解C#高级概念(一) Delegate委托

做.NET开发很久,最近重新温习《C#高级编程》一书。发现很多曾经似懂非懂的问题,其实也是能够慢慢钻研慢慢理解的。 所以,打算开写《C#高级编程系列》博文。其中会借鉴《C#高级编程》一书的概念,也会参照其他高手的博文,希望大家谅解。有不对的地方,欢迎指正。 (另:本博文不会讲解定义,语法方面的基础知识。) 下面如题,我们来讲委托Delegate委托,在.NET中应用的非常广泛。

chamychen的专栏 2万+

年度语言之--c#中的委托

在Java的世界开发中,我们习惯于使用接口(Interfaces)和匿名类(Anonymous Classes),特别是在处理事件监听器(Event Listeners)或实现回调(Callbacks)时。这对于代码的可读性和自文档化特别重要。委托C#中扮演了一个类似于Java中接口和Lambda表达式的角色,但它们的工作方式和用法有所不同。C#中的事件是基于委托的,提供了一种在发生特定操作时触发和处理这些操作的机制。在C#中,委托是一种引用类型,它可以引用具有特定参数列表和返回类型的方法。

dadenny的博客 950

快速理解C#高级概念(二) 事件委托的区别

根据上篇博文的反响我想向大家说明,因为本人时间有限加上才疏学浅,无法写出面面俱到的博文。我只是把自己经历的觉得有些意义的技术点分享出来,希望大家见谅。当然,我不会让大家走上歧途的。所有示例都是亲测。 今天我想讨论一下事件委托之间的联系。很多人说,事件委托。真的是这样吗?那么微软为何又要定义事件委托两个概念呢? 其实事件委托,在我看来不如这样解释:事件是封装过的委托实例。也就是说,事件

chamychen的专栏 5974

C#中的委托事件(分分钟上手)

每一个初学C#的程序猿,在刚刚碰到委托事件的概念时,估计都是望而却步,茫然摸不到头脑的。百度一搜,关于概念介绍的文章大把大把的,当然也不乏深入浅出的好文章。可看完这些文章,大多数新手,估计也只是信心满满的觉得自己看懂了,一旦要在自己的程序中用上委托事件,就傻眼了,根本不知道什么情况下该用,也不知道具体怎么用。 本文没有任何概念介绍,旨在帮助同学们快速用上委托事件,进入C#的更高境界。 首...

持之以恒 6702

C# 利用在窗体之间传值来通俗讲委托事件

委托事件C#中很重要的一个知识点,网上找关于委托事件的文章也是一大堆,但是讲的好的却不多。对于初学者来说,这个知识点的理解和使用是很重要的。我本身也不是专业的编程人员,只是工作需要,自己学了点编程,对委托事件理解也只是皮毛,但是也是我个人的一个理解,希望能帮助同为初学者的我们快速直观的理解和使用委托事件。如有不当请大家指正。 在C#编程中随处可见事件,windows本身机制也是事件驱动,举个例子,现在form1中有个按钮button1,双击按钮,会出现如下代码, private void but

weixin_38154901的博客 463

上位机C#委托delegate事件event)的快速理解

具有返回值的委托类型,返回值默认是最后一个函数的返回值,就是最后添加的返回值。

tpz200296的博客 466

快速理解C#委托事件之间关系的伪代码

<br />下面这段有关讲解委托事件的代码是伪代码,很形象地讲解了委托事件之间的关系,对新手理解很有帮助,值得收藏。<br /> <br />using System;<br />using System.Collections.Generic;<br />using System.Text;<br />namespace ConsoleApplication7<br />{<br />    delegate void 事件处理格式1();<br />    delegate void 事件处理格式2

fwangmm的专栏 675

C# 跨窗体操作中的委托应用全解析

C#和许多其他编程语言中,委托Delegates)是一种类型,它可以持有对具有特定参数列表和返回类型的方法的引用。简单来说,委托相当于“函数指针”,但传统意义上的函数指针不同,委托是面向对象的、类型安全的,并且更加灵活。在C#中,委托Delegate)是一种类型,它可以引用具备特定参数列表和返回类型的方法。委托使得我们可以将方法作为参数传递给其他方法,或者将方法挂载到事件上。这为实现松耦合的编程提供了可能,从而提高了代码的可复用性和模块化。

weixin_42509507的博客 1062

Unity委托事件:从C#基础到UnityEvent实战应用

C#编程中,委托是一种类型安全的函数指针,它允许将方法作为参数传递和存储,是实现回调机制和事件驱动编程的基础。其核心原理是通过定义方法签名来创建委托类型,从而实现方法的间接调用和多播能力。这一机制在软件开发中具有重要价值,能够有效降低模块间的耦合度,提升代码的可维护性和扩展性。在游戏开发领域,尤其是Unity引擎中,委托事件的应用场景极为广泛,从简单的UI交互到复杂的游戏系统通信都离不开它们。Unity进一步封装了C#委托机制,提供了UnityAction和UnityEvent等工具,使得开发者能够在

weixin_30367873的博客 559

C#基础1-事件委托

委托简单理解为一个函数类型的变量(引用类型),表示一个方法的引用。官网解释 delegate定义委托类型定义对应委托类型的处理函数 实例化委托类型的变量一个委托可以绑定多个事件处理函数使用委托变量,调用委托对应的所有事件处理函数接口(interface)是约束某个类应该具备那些功能的一个集合,约束了类应该具备那些方法,便于类的管理和扩展,使用接口还能解决类的单继承问题。委托delegate)是方法的一个集合,使用委托可以对这个方法集合进行操作,如 += 。在以下情况中使用接口:在以下情况中使用委托事件

cocodeveloper 825
上一篇: Android 自定义系统对话框
下一篇: Android使用自定义字体
Wiiix
博客等级 码龄11年 11粉丝 12原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值