`

委托与事件

    博客分类:
  • C#
阅读更多

委托示例:

class Client
    {
        static void Main(string[] args)
        {
            Client client = new Client();
            //创建委托,代理ByProxy方法,注意这里是方法名,不带括号!
            wt w = new wt(client.ByProxy);
            //调用被代理的方法,只需委托名加括号!
            w();
            Console.ReadKey();
        }
       //通过委托代理的方法返回值和参数必须和定义的委托匹配.
        public void ByProxy()
        {
            Console.WriteLine("我被委托调用啦。。。。");
        }
    }

    /// <summary>
    /// 定义委托
    /// </summary>
    public delegate void wt();

 

 以上代码是没有意义的,只是要明白委托可以这样使用.

 

委托的作用:
1.在.net中委托是方法与事件的中间桥梁.一旦事件被触发,它肯定要
执行这个功能,而完成功能的是一个方法,委托是介于事件和方法之
间.

 

2.实现异步调用.

 

委托与事件示例:

class Client
    {
        static void Main(string[] args)
        {
            Client client = new Client();
           //wt委托指向了ByProxy方法,事件通过委托调用方法(就是把ByProxy方法通过委托订阅到事件上了)
            sj+= new wt(client.ByProxy);
            //可以添加多个委托给事件
            sj += new wt(client.ByProxy2);
            //可以重复添加调用
            sj += new wt(client.ByProxy2);
            /*.net2.0开始可以这样简写,它会隐式转换为wt委托类型,然后
            通过wt委托,调用被代理的方法(因为sj这个事件定义的时候就知道运用了wt这种委托,所以可以省略.如果ByProxy2方法不符合wt委托类型,会报错!)
             */
            sj += client.ByProxy2;
            //调用事件,由于把事件定义为静态的否则要通过Client类的实例调用如:client.sj();委托调用和方法一样.
            sj();
            //以上说明:事件其实是一个列表(事件列表)可以通过+=加载很多通过委托代理的方法
            Console.ReadKey();
        }

        //注意这里是静态的
        public static event wt sj;

        public void ByProxy()
        {
            Console.WriteLine("我被委托调用啦。。。。");
        }

        public  void ByProxy2()
        {
            Console.WriteLine("我被委托调用啦。。。。");
        }
    }

    /// <summary>
    /// 定义委托
    /// </summary>
    public delegate void wt();

 

c#中的事件不可以在A类中显式的去调用B类的事件.

 

/// <summary>
    /// 举例在Client类中调用ABC中的事件
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            ABC abc = new ABC();
            abc.sj += new ABC.wt(abc.ByProxy);//这里这样调用会发生错误
            abc.sj();

            Console.ReadKey();
        }

    }

    class ABC
    {
        public delegate void wt();
        public event wt sj;

        public void ByProxy()
        {
            Console.WriteLine("我被委托调用啦。。。。");
        }

        public void ByProxy2()
        {
            Console.WriteLine("我被委托调用啦。。。。");
        }
    }

 

通过定义方法实现A类中调用B类的事件.

 

   /// <summary>
    /// 举例在Client类中调用ABC中的事件
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            ABC abc = new ABC();
            abc.dy();
            Console.ReadKey();
        }

    }

    class ABC
    {
        public delegate void wt();
        public event wt sj;

        public void ByProxy()
        {
            Console.WriteLine("我被委托调用啦。。。。");
        }

        public void ByProxy2()
        {
            Console.WriteLine("我被委托调用啦。。。。");
        }

        public void dy()
        {
            //通过定义方法实现A类中调用B类的事件.
            ABC abc = new ABC();
            abc.sj += new wt(abc.ByProxy);
            abc.sj();
            //this.sj += new wt(this.ByProxy);
            //sj();
        }
    }

 

委托代理的方法不一定是自己类中的方法,可以代理其他类中的方法.只要该方法
与委托类型匹配即可!

 

 class Client
    {
        static void Main(string[] args)
        {
            ABC abc = new ABC();
            //调用触发事件的方法.
            abc.dy();
            Console.ReadKey();
        }

        //在Client中定义一个方法
        public void ClientMethod()
        {
            Console.WriteLine("我被ABC类的wt委托代理了!");
        }

    }

    class ABC
    {
        public delegate void wt();
        public event wt sj;

        public void ByProxy()
        {
            Console.WriteLine("我被委托调用啦。。。。");
        }

        public void ByProxy2()
        {
            Console.WriteLine("我被委托调用啦。。。。");
        }

        public void dy()
        {
            ABC abc = new ABC();
            //创建Client类实例
            Client client = new Client();
            //在abc类中通过wt委托代理client的ClientMethod
            abc.sj += new wt(client.ClientMethod);
            //调用事件.
            abc.sj();
        }
    }

 

为什么要使用委托链?

 

 delegate void EatDelegate(String food);

    /// <summary>
    /// 为什么要使用委托链?
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            /*张三李四王五都在吃同一样对象西瓜
             为什么要输入三次这样很麻烦.
             * 可以通过委托链只输入一次西瓜同时调用三个函数
             */
            EatDelegate zs = new EatDelegate(Client.zsEat);
            EatDelegate ls = new EatDelegate(Client.lsEat);
            EatDelegate ww = new EatDelegate(Client.wwEat);
            zs("西瓜");
            ls("西瓜");
            ww("西瓜");
            Console.ReadKey();
        }


        public static void zsEat(String food)
        {
            Console.WriteLine("张三吃"+food);
        }

        public static void lsEat(String food)
        {
            Console.WriteLine("李四吃"+food);
        }

        public static void wwEat(String food)
        {
            Console.WriteLine("王五吃" + food);
        }
    }

 

使用委托链

 

delegate void EatDelegate(String food);

    /// <summary>
    /// 委托链的使用!
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            EatDelegate zs = new EatDelegate(Client.zsEat);
            EatDelegate ls = new EatDelegate(Client.lsEat);
            EatDelegate ww = new EatDelegate(Client.wwEat);
            //定义一个委托引用充当委托链
            EatDelegate eatChain;
            //让他们相加赋值给eatChain,这样他们会依次去调用相加的委托所代理的方法
            eatChain = zs + ls + ww;
            eatChain("西瓜");
            //用+=的写法:
            //eatChain = zs;
            //eatChain += ls;
            //eatChain += ww;
            //当然通过-=号可以开除李四(ls)吃西瓜
            eatChain -= ls;
            eatChain("西瓜");
            //c#重载了+=和-=号来对委托链里的元素进行添加,删除操作.
            Console.ReadKey();
        }


        public static void zsEat(String food)
        {
            Console.WriteLine("张三吃"+food);
        }

        public static void lsEat(String food)
        {
            Console.WriteLine("李四吃"+food);
        }

        public static void wwEat(String food)
        {
            Console.WriteLine("王五吃" + food);
        }
    }

 

 委托代理匿名方法

 

 delegate void EatDelegate(String food);

    /// <summary>
    /// 委托代理匿名方法
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            EatDelegate eatChain = null;
            eatChain += delegate(String food){ Console.WriteLine("张三吃"+food); };
            eatChain += delegate(String food) { Console.WriteLine("李四吃" + food); };
            eatChain += delegate(String food) { Console.WriteLine("王五吃" + food); };
            eatChain("西瓜");
            Console.ReadKey();
        }
    }

 

把委托当做方法的参数进行传递,并对它进行动态的调用.

 

delegate void EatDelegate(String food);

    /// <summary>
    /// 把委托当做方法的参数进行传递,并对它进行动态的调用.
    /// </summary>
    class Party
    {
        //通过定义可变的委托数组把委托当做参数传递.
        static void EatToghter(string food,params EatDelegate [] values)
        {
            if (values==null)
            {
                Console.WriteLine("坐谈会结束!");
            }
            else
            {
                EatDelegate eatChain = null;
                foreach (EatDelegate ed in values)
                    eatChain += ed;
                eatChain(food);

            }
        }

        static void Main(string[] args)
        {
            Man zs = new Man("张三");
            Man ls = new Man("李四");
            Man ww = new Man("王五");
            EatDelegate zsd= new EatDelegate(zs.Eat);
            EatDelegate lsd= new EatDelegate(ls.Eat);
            EatDelegate wwd= new EatDelegate(ww.Eat);
            EatToghter("西瓜", zsd, lsd, wwd);
            Console.WriteLine("----------------------");
            EatToghter("香蕉", zsd, lsd);
            Console.WriteLine("----------------------");
            EatToghter(null,null);
            Console.ReadKey();
        }
    }

    class Man
    {
        private string name;

        //通过定义构造函数来对委托进行动态调用
        public Man(String name)
        {
            this.name = name;    
        }

        public void Eat(string food)
        {
            Console.WriteLine(name+"吃"+food);
        }
    }

 

   综合示例:

   图: 

  

 

  示例代码1:

public class Publish //发行者(出版社)
    {
        public delegate void publish();//声明事件所需的代理
        
        public event publish OnPublich;//事件的声明
       
        /*发事件的方法(前面说过A类的事件不能在B类中触发,
        需要在自己类中定义触发事件的方法,在B类中调用A类触发
         事件的方法)*/
        public void issue()
        {
            //如果事件不等于空发行刊物
            if (OnPublich != null)
            {
                Console.WriteLine("发行刊物!");
                this.OnPublich();//调用事件
            }
        }
    }

    public class Subscriber //订阅者
    {
        //在事件订阅者中定义事件处理程序
        public void Receive()
        {
            Console.WriteLine("订阅者已经收到刊物!");
        }
    }

    public class Story
    {
        public static void Main(String[] args)
        {
            //创建事件订阅者:张三
            Subscriber zs = new Subscriber();
            //创建事件发行者:出版社
            Publish publish = new Publish();
            //向事件发行者订阅一个事件
            publish.OnPublich += new Publish.publish(zs.Receive);
            //调用触发事件的方法
            publish.issue();

            Console.ReadKey();
        }
    }

 

出版社决定扩大规模,出版两种杂志(电脑杂志和生活杂志).

示例代码2:

 

  /// <summary>
    /// 事件发行者
    /// </summary>
    public class Publish
    {
        //发行电脑杂志事件所需的代理
        public delegate void PubCompute(String magazineName);
        //发行生活杂志事件所需的代理
        public delegate void PubLift(String magazineName);

        public event PubCompute OnPubCompute;
        public event PubLift OnPubLift;

        /// <summary>
        /// 触发电脑杂志事件的方法
        /// </summary>
        public void Computeissue()
        {
            if (OnPubCompute != null)
            {
                Console.WriteLine("发行电脑杂质:");
                OnPubCompute("电脑杂志");
            }
        }

        /// <summary>
        /// 触发生活杂志事件的方法
        /// </summary>
        public void Liftissue()
        {
            if (OnPubLift != null)
            {
                Console.WriteLine("发行生活杂志:");
                OnPubLift("生活杂志");
            }
        }

    }

    /// <summary>
    ///事件订阅者
    /// </summary>
    public class Subscriber
    {
        private String name;

        public Subscriber(string name)
        {
            this.name = name;
        }

        public void Receive(string magazineName)
        {
            Console.WriteLine(name + "订阅了" + magazineName);
        }
    }

    public class Story
    {
        public static void Main(string[] args)
        {
            //创建出版社
            Publish publish = new Publish();
            //创建了订阅者张三
            Subscriber zs = new Subscriber("张三");
            //创建了订阅者李四
            Subscriber ls = new Subscriber("李四");
            //张三订阅了电脑杂志
            publish.OnPubCompute += new Publish.PubCompute(zs.Receive);
            //李四订阅了电脑杂志
            publish.OnPubCompute += new Publish.PubCompute(ls.Receive);
            //张三又订阅了生活杂志
            publish.OnPubLift += new Publish.PubLift(ls.Receive);
            //出版社发行杂志了(调用触发事件的方法)
            publish.Computeissue();
            publish.Liftissue();


            Console.WriteLine("-----------------------------------------");
            Console.WriteLine("一年后李四退定了电脑杂志!");
            publish.OnPubCompute -= new Publish.PubCompute(ls.Receive);
            Console.WriteLine("一年出版社发行杂志!");
            //出版社发行杂志了(调用触发事件的方法)
            publish.Computeissue();
            publish.Liftissue();
            Console.ReadKey();
        }
    }

   以上说明:事件发行者只会把事件发送给订阅该事件的用户.如果有多个
   用户订阅了同个事件,那么该事件触发时,它就会把消息发送
    给多个用户.

 

 

 

小结:
委托:
委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法.对于静
态方法,委托对象封装要调用的方法.对于实例方法,委托对象同时封装一个实例和该实例
上的一个方法.如果你有一个委托对象和一组适当的参数(和委托类型相匹配的方法),
则可以用这些参数调用该委托.委托就是c++的函数指针,通过代理指向被代理的函数(方法)
不过c++只能指向静态方法.而委托除了可以指向静态方法还可以指向对象实例的方法.最大
的差异是委托是完全面向对象且使用安全的类型,另外委托可以在程序执行时传入方法的名称.
动态的决定预调用的方法.委托的本质就是一个类,凡可以声明类的地方都可以调用委托.

 

事件:
事件是类在发生其关注的事情时用来提供通知的一种方式.
例如,封装用户界面控件的类可以定义一个在用户单击该控件
时发生的事件.控件类不关心单击按钮时发生了什么,但它需要
告知派生类单击事件已发生.然后,派生类可选择如何响应.

 

事件发行者(Publisher):
一个事件发行者,也称作发送者(sender)或者事件源,其实就是一个对象,
这个对象自行维护本身的状态信息.当本身状态信息变动时,便触发一个事件,
并通知所有的事件订阅者.

 

事件订阅者(Subscriber):
对事件感兴趣的对象,也称接收这(Receiver),可以注册感兴趣的事件,通常需提供
一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码.

 

定义一个完整事件的四个步骤:
1.在事件发行者中(发行者类中)定义一个事件
2.在事件发行者中(发行者类中)触发事件
3.在事件订阅者中定义事件处理程序(也就是被代理的方法,触发该事件执行的方法)
4.向事件发行者订阅一个事件(通过委托把被代理的方法(事件处理程序)订阅给事件发行者)

 

 

 

.Net Framework事件设计准则
1.事件的命名准则应使用PascalCasing命名方式(每个单词首字母大写.)

 

2.声明delegate时,使用void类型当做返回值,因为事件它的本质是委托链
一个委托链可以包含多个代理,如果每个代理都有返回值,那将只能返回最后
一个值所以事件拥有返回值就失去了它的意义.

 

3.委托的命名是事件名加事件处理程序(被委托代理的方法)
事件接受两个传入参数,一律命名为sender与e.

 

例如:public delegate void EventNameEventHandler(object sender,EventNameEventArgs e);

 

4.参数e的类型可以为EventArgs类

e的类型还可以自己声明一个类,而这个类是从
从System.EventArgs派生而来,如果我们的事件要传输
一个或多个参数,这个时候就可以从System.EventArgs派生
一个类把这些参数全部打包在这个类里面,当然这个类也有命名
规范:事件名加上事件参数(EventNameEventArgs)进行命名

 

5.如果事件不需要传递任何数据,也要声明两参数,e参数可以直接使用
系统提供的System.EventArgs类.如果需要传递数据,则要从System.Eventargs
继承一个类,并把数据放到里面.

 

命名规范示例:
public delegate void EventNameEventHandler(object sender,EventArgs e);
public event EventNameEventHandler EventName

 

 

6.在引发事件的类中提供一个受保护的方法,以OnEventName进行命名.
在该方法中引发该事件


例如:
//声名为虚方法,可以给它的子类重写.
protected virtual void OnEventName(EventArgs e)
{
  /*为什么要用临时变量来操作事件呢?
    这样做主要是为了防止存在线程同步问题.
    */
 EventHandler handler=Event;
 if(EventName!=null)
 {
  EventName(this,e);
 }
}

 

  

  

   根据.net规范编写委托事件示例:

 

    /// <summary>
    /// 按照.net规范,事件有一个或多个参数
    ///需要从System.EventArgs派生出
    ///一个类把这些参数全部打包在这个类里面,
    /// </summary>
    public class PubEventArgs
    {
        /*readonly关键字的作用是,当给定义readonly的变量赋值后
         就不能在改变这个变量的值(只读的)*/

        //杂志名称
        private readonly string magazineName;

        public string MagazineName
        {
            get { return magazineName; }
        }
        //出版时间
        private readonly DateTime publishDate;

        public DateTime PublishDate
        {
            get { return publishDate; }
        }

        public PubEventArgs(string magazineName, DateTime publishDate)
        {
            this.magazineName = magazineName;
            this.publishDate = publishDate;
        }


    }

    /// <summary>
    /// 事件发行者(出版社)
    /// </summary>
    public class Publich
    {
        /*按照.net规范声明事件所需的代理(委托名称为:事件名+EventHandler)
         * 参数:无参数的情况下可以定义为:delegate void PubComputerEventHandler(object sender,System.EventArgs e);
         * 以下定义的PubEventArgs类型是继承自System.EventArgs的一个类,把定义的参数放在里面.
         */
        public delegate void PubComputerEventHandler(object sender, PubEventArgs e);
        public delegate void PubLiftEventHandler(object sender, PubEventArgs e);
        //声明事件
        public event PubComputerEventHandler PubComputer;
        public event PubLiftEventHandler PubLift;

        /*定义触发事件的方法按照规范
         * 它的访问修饰符为protected
         * 并且是可被子类重写的
         * 命名为事件名前加上一个On
         */
        protected virtual void OnPubComputer(PubEventArgs e)
        {
            /*为什么要用临时变量来操作事件呢?
            这样做主要是为了防止存在线程同步问题.
            */
            PubComputerEventHandler handler = PubComputer;
            if (handler != null)
            {
                //触发事件
                handler(this, e);
            }
        }

        protected virtual void OnPubLift(PubEventArgs e)
        {
            PubLiftEventHandler handler = PubLift;
            if (handler != null)
            {
                PubLift(this, e);
            }
        }


        //调用触发事件的方法的方法
        public void issueComputer(String magezineName, DateTime publishDate)
        {
            Console.WriteLine("发行了" + magezineName);
            OnPubComputer(new PubEventArgs(magezineName, publishDate));
        }

        public void issueList(String magezineName, DateTime publishDate)
        {
            Console.WriteLine("发行了" + magezineName);
            OnPubLift(new PubEventArgs(magezineName, publishDate));
        }
    }

    /// <summary>
    ///事件订阅者
    /// </summary>
    public class Subscriber
    {
        private string name;
        public Subscriber(string name)
        {
            this.name = name;
        }

        //事件处理程序
        public void Receive(object sender, PubEventArgs e)
        {
            Console.WriteLine(e.PublishDate + " " + name + "收到了" + e.MagazineName);
        }
    }

    public class Client
    {
        public static void Main(String[] args)
        {
            //创建一个出版社
            Publich publish = new Publich();
            //创建一个事件订阅者:张三
            Subscriber zs = new Subscriber("张三");
            //创建一个事件订阅者:李四
            Subscriber ls = new Subscriber("李四");
            //张三订阅了电脑杂志,当事件触发时将引发代理的zs.Receive方法
            publish.PubComputer += new Publich.PubComputerEventHandler(zs.Receive);
            //李四订阅了电脑杂志,当事件触发时将引发代理的ls.Receive方法
            publish.PubComputer += new Publich.PubComputerEventHandler(ls.Receive);
            //李四订阅了生活杂志,当事件触发时将引发代理的ls.Receive方法
            publish.PubLift += new Publich.PubLiftEventHandler(ls.Receive);
            //引发事件
            publish.issueComputer("电脑杂志", Convert.ToDateTime("2008-1-1 10:30:00"));
            publish.issueList("生活杂志", Convert.ToDateTime("2008-1-1 10:30:00"));

            Console.WriteLine("一年后...................");
            Console.WriteLine("-------------------------");
            //李四退订了电脑杂志
            publish.PubComputer -= new Publich.PubComputerEventHandler(ls.Receive);
            publish.issueComputer("电脑杂志", Convert.ToDateTime("2009-1-1 10:30:00"));
            publish.issueList("生活杂志", Convert.ToDateTime("2009-1-1 10:30:00"));
            Console.ReadKey();
        }
    }

 

  • 大小: 23.6 KB
分享到:
评论

相关推荐

    委托与事件调用示例

    总结一下,`委托与事件`是.NET编程中不可或缺的部分,它们允许我们创建回调机制,处理异步操作,并实现解耦的设计。在`PrintDemo1`示例中,我们看到如何定义委托,创建事件,以及如何订阅和触发事件。通过深入学习和...

    委托与事件的简单例子

    在这个“委托与事件的简单例子”中,我们可能会看到以下代码结构: 1. **定义委托**: 首先,我们需要定义一个委托类型,表示我们的事件处理方法签名。例如: ```csharp public delegate void ...

    c#委托与事件实例讲解

    本文将深入探讨C#中的委托与事件,并通过实例来帮助理解它们的工作原理和使用场景。 首先,我们来了解什么是委托。在C#中,委托是一种类型安全的指针,它可以指向一个方法。换句话说,委托可以被视为能够存储方法的...

    C#中委托与事件的区别

    此外,关于委托和事件的中间代码,也就是编译器在编译时生成的与委托和事件相关的IL代码,同样需要深入理解。中间代码涉及到方法指针、调用约定、闭包等概念,它们是理解.NET运行时如何实际执行委托和事件操作的关键...

    C# 委托与事件的概念及理解

    C# 委托与事件的概念及理解 委托是 C# 中一个非常重要的概念,它可以看作是一个函数指针,能够引用对象方法,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个对象方法,将其作为它构造函数的...

    VS2010轻松学习C#-从零到深入-天轰穿.NET4趣味编程视频教程_第25讲:委托与事件实例浅析

    在本节“VS2010轻松学习C# - 从零到深入 - 天轰穿.NET4趣味编程视频教程_第25讲:委托与事件实例浅析”中,我们将深入探讨C#编程中的两个核心概念:委托(Delegates)和事件(Events)。这两个概念在.NET框架中扮演...

    c#委托与事件的关系

    ### C#中的委托与事件关系解析 #### 一、引言 在面向对象编程语言C#中,委托(Delegate)和事件(Event)是两个重要的概念。本文将深入探讨这两者之间的关系及其在实际开发中的应用。 #### 二、委托(Delegate) ...

    c#中的委托与事件把委托事件讲透 读书笔记 学习心得

    C#中的委托与事件讲透读书笔记学习心得 在C#中,委托和事件是两个非常重要的概念,它们在.NET Framework中的应用非常广泛。然而,对于很多初学者来说,理解委托和事件并不是一件容易的事情。它们就像是一道槛儿,过...

    C#委托与事件

    在C#编程语言中,委托和事件是两个非常重要的概念,它们构成了事件驱动编程的基础。...在实际项目中,结合文档《C#委托与事件.doc》的详细分析,初学者将更好地掌握这些概念,并能够在实践中得心应手。

    委托与事件程序例子

    委托和事件是C#编程语言中的重要特性,它们在实现对象间的通信和解耦中扮演着关键角色。本文将深入探讨这两个概念,并通过一个具体的示例来解释...通过理解和熟练掌握委托与事件,开发者可以写出更高效、更灵活的代码。

    CH10 委托与事件

    在本章"CH10 委托与事件"中,我们将深入探讨这两种机制,以及如何在C#编程中有效地利用它们。 首先,让我们了解一下**委托**。委托可以被看作是“类型安全”的函数指针,它允许我们存储对方法的引用,并可以在稍后...

    C#委托与事件(张子阳).pdf

    ### C#中的委托与事件详解 #### 一、引言 在.NET Framework中,委托与事件是非常重要的概念,尤其对于那些需要实现回调机制的应用场景来说更是如此。虽然这些概念对于初学者来说可能有些抽象和难以理解,但一旦...

    C#编写的委托与事件的十个精典的例子(可以直接运行)

    委托类型必须与指定的方法签名匹配。例如,我们可以定义一个处理数字相加的委托,然后将两个加法方法绑定到这个委托,以便在适当的时候调用它们。 2. **事件定义**:事件是类的一种特殊类型的委托,用于在对象之间...

    cweituo.rar_委托与事件_委托开发

    本文将深入探讨委托与事件的基本概念,以及如何在实际开发中运用它们。 **一、委托(Delegates)** 1. **定义**:委托在.NET中是一种类型,它封装了对方法的引用。换句话说,委托可以看作是函数指针的高级版本,...

    C# 委托与事件,实例代码,调试通过.

    在C#编程语言中,委托和事件是两个关键的概念,它们是实现面向对象设计模式,尤其是事件驱动编程的基础。本文将深入探讨这两个概念,并通过实际的代码示例...希望这些实例代码能帮助你更好地掌握和应用C#的委托与事件。

    C#委托与事件的详解

    【C#委托与事件详解】 委托是C#中一种强大的特性,它允许我们将方法作为参数传递,这在处理事件和回调机制中尤为重要。在.NET Framework中,委托是类的实例,它封装了一个或多个方法,使得我们可以像操作对象一样...

Global site tag (gtag.js) - Google Analytics