一、delegate 的用法

using System;

namespace hellword
{

    //定义一个委托
    public delegate void delegateMedth (int a, int b,string Desc);

    //定义一个类
    public class MedthClass
    {

        //定义需要委托执行的方法
        public void Sum(int a, int b, string Desc)
        {
            Console.WriteLine(Desc +"求和:"+ (a + b).ToString());
        }

        //定义需要委托执行的方法
        public void Less(int a, int b, string Desc)
        {
            Console.WriteLine(Desc + "求差:" + (a - b).ToString());
        }

        //定义需要委托执行的方法
        public void Multiply(int a, int b, string Desc)
        {
            Console.WriteLine(Desc + "求乘:" + (a * b).ToString());
        }
        

        //定义接受参数中包含委托的方法
        public void SumTransit(int a, int b, string Desc, delegateMedth callback)
        {
            callback(a, b, Desc);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MedthClass m = new MedthClass();

            //使用场景1
            delegateMedth delegateA = new delegateMedth(m.Sum);
            delegateA(1, 2, "使用场景1");

            //使用场景2
            m.SumTransit(1, 2, "使用场景2", delegateA);

            //使用场景3
            delegateMedth delegateSum= new delegateMedth(m.Sum);
            delegateMedth delegateLess = new delegateMedth(m.Less);
            delegateMedth delegateMultiply = new delegateMedth(m.Multiply);

            delegateMedth delAll = delegateSum + delegateLess;
            delAll += delegateMultiply;

            delAll(1, 2, "使用场景3,委托的累加。");

            //使用场景4
            delAll -= delegateSum;
            delAll(1, 2, "使用场景4,委托的累加。");

            //使用场景5
            delegateMedth CopydelAll = delAll - delegateLess;
            CopydelAll(1, 2, "使用场景5,委托的减。");

            Console.WriteLine("Hello World!");
            Console.ReadLine();
        }

    }

}

 

 二、event 的用法之一

using System;

namespace hellword
{
    //定义一个委托
    public delegate void CustomEventHandler(object sender, CustomEventArgs args);

    class Program
    {
        static void Main(string[] args)
        {
            var pub = new CustomEventPublisher();
            var sub1 = new CustomEventSubscriber("sub1", pub);
            var sub2 = new CustomEventSubscriber("sub2", pub);

            // Call the method that raises the event.
            pub.DoSomething();

            // Keep the console window open
            Console.WriteLine("Press any key to continue...");
            Console.ReadLine();
            Console.ReadLine();
        }
    }

    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string message)
        {
            Message = message;
        }

        public string Message { get; set; }

        public string id { get; set; }
    }

    //自定义事件发布者
    public class CustomEventPublisher
    {
        //定义一个事件
        public event CustomEventHandler CustomEvent;

        public void DoSomething()
        {
            //在此编写一些有用的代码,然后引发该事件。 您还可以在执行代码块之前引发一个事件。
            OnRaiseCustomEvent(new CustomEventArgs("Event triggered"));
        }

        protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
        {

            // 如果没有订阅者,事件将为null
            if (CustomEvent != null)
            {
                //格式化字符串以在CustomEventArgs参数内发送
                e.Message += $" at {DateTime.Now}";

                // 搞事
                CustomEvent(this, e);
            }
        }

    }

    //自定义事件订阅者
    public class CustomEventSubscriber
    {
        private readonly string _id;

        public CustomEventSubscriber(string id, CustomEventPublisher pub)
        {
            _id = id;

            // 订阅
            pub.CustomEvent += HandleCustomEvent;

        }

        //定义引发事件时要采取的措施。
        void HandleCustomEvent(object sender, CustomEventArgs e)
        {
            Console.WriteLine($"{_id} received this message: {e.Message}");
        }



    }
}

 三、event 的用法之二

posted on 2021-02-03 11:36  逆天蓝  阅读(132)  评论(0)    收藏  举报