C#委托与事件

委托的一般使用:
• 实例:把方法当作参数传给另一个方法
1.正确使用1:模板方法,“借用”指定的外部方法来产生结果
1) 相当于“填空题”
2)常位于代码中部
3) 委托有返回值
2.正确使用2:回调(callback)方法,调用指定的外部方法
1)相当于“流水线”
2)常位于代码末尾
3) 委托无返回值

参考代码:

 class Program
    {
        static void Main(string[] args)
        {
            WrapFactory wrapFactory = new WrapFactory();
            ProductFactory productFactory = new ProductFactory();
            Logger logger = new Logger();

            //Func<T,TResult> 和Action<T>是C#内建好的委托,可以直接使用,省去重新声明一个委托的步骤,其中Action<T>没有返回类型
            Func<Product> fun1 = new Func<Product>(productFactory.MakeToyCar);
            Action<Product> action1 = logger.Log;

            Box box1 = wrapFactory.WrapProduct(fun1,logger.Log);
            Box box2 = wrapFactory.WrapProduct(productFactory.MakePizza,action1);

            Console.WriteLine(box1.Product.Name);
            Console.WriteLine(box2.Product.Name);
        }
    }

    class Logger
    {
        public void Log(Product product)
        {
            Console.WriteLine("Product:{0} created at {1}.Price is {2}.",product.Name,DateTime.Now,product.Price);
        }
    }

    class Product
    {
        public string Name { get; set; }
        public int Price { get; set; }
    }

    class Box
    {
        public Product Product { get; set; }
    }

    class WrapFactory
    {
        /// <summary>
        /// 委托的一般用法
        /// </summary>
        /// <param name="getProduct">作为模板方法来使用</param>
        /// <param name="log">作为回调方法来使用</param>
        /// <returns></returns>
        public Box WrapProduct(Func<Product> getProduct,Action<Product> log)
        {
            Box box = new Box();
            Product product = getProduct();
            box.Product = product;

            if (product.Price > 50)
            {
                log(product);
            }
            return box;
        }
    }

    class ProductFactory
    {
        public Product MakePizza()
        {
            Product product = new Product();
            product.Name = "Pizza";
            product.Price = 20;
            return product;
        }

        public Product MakeToyCar()
        {
            Product product = new Product();
            product.Name = "Toy Car";
            product.Price = 200;
            return product;
        }
    }

事件模型的五个组成部分
1. 事件的拥有者
2. 事件成员
3. 事件的响应者
4. 事件处理器
5. 事件订阅

个人理解使用事件的步骤:
1.声明一个委托(如果使用C#内建委托类型,可以省去此步骤)
2.声明一个基于委托的事件
3.引发事件,通常要判断事件是否为null

if (OnOrder != null)
{
   OnOrder(this, menu);
}

4.编写用于响应事件的处理函数
5.执行事件订阅

参考代码:

class Connection
    {
        //使用C#内建委托Action声明事件
        public event Action<string> MessageArrived;
        private Timer pollTimer;

        public Connection()
        {
            pollTimer = new Timer(100);
            pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
        }

        public void Connect()
        {
            pollTimer.Start();
        }

        public void Disconnect()
        {
            pollTimer.Stop();
        }

        Random random = new Random();
        private void CheckForMessage(object source,ElapsedEventArgs e)
        {
            Console.WriteLine("Checking for new message.");

            if (random.Next(9) == 0 && MessageArrived != null)
            {
                //引发事件
                MessageArrived("Hello Mum!");
            }
        }
    }
class Display
    {
        //用于响应事件的处理函数
        public void DisplayMessage(string message)
        {
            Console.WriteLine("Message arrived:{0}.", message);
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            Connection connection = new Connection();
            Display display = new Display();
            //事件的订阅
            connection.MessageArrived += new Action<string>(display.DisplayMessage);
            connection.Connect();
            Console.ReadKey();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值