甜羊羊 2022-01-19 15:31 采纳率: 87.5%
浏览 32

刘铁猛讲C#的事件时举的一个例子看不太明白

代码如下,我不太明白:

  1. this.orderEventHandler.Invoke(this,e)是如何触发public event OrderEventHandler Order事件的?
  2. this.orderEventHandler.Invoke(this,e)这里的this是什么意思?
  3. public event OrderEventHandler Order下面定义的add、remove、+=value是什么意思?

namespace Event3
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer();
            Waiter waiter = new Waiter();
            customer.Order += waiter.Action;
            customer.Action();
            customer.PayBill();
            Console.ReadLine();
        }
    }

    public class OrderEventArgs:EventArgs
    {
        public string DishName { get; set; }
        public string Size { get; set; }
    }

    public delegate void OrderEventHandler(Customer customer, OrderEventArgs e); 
    
    public class Customer
    {
        private OrderEventHandler orderEventHandler;

        public event OrderEventHandler Order
        {
            add
            {
                this.orderEventHandler += value;
            }
            remove
            {
                this.orderEventHandler -= value;
            }

        }
        public double Bill { get; set; }
        public void PayBill()
        {
            Console.WriteLine("I will pay ${0}",this.Bill);
        }

        public void WalkIn()
        {
            Console.WriteLine("Walk into the restaurant.");
        }
        public void SitDown()
        {
            Console.WriteLine("Sit down.");
        }
        public void Think()
        {

            Console.WriteLine("Let me think...");
            Thread.Sleep(1000);

            
            if (this.orderEventHandler!=null)
            {
                OrderEventArgs e = new OrderEventArgs();
                e.DishName = "Kongpao Chicken";
                e.Size = "large";
                this.orderEventHandler.Invoke(this,e);
            }
            
        }

        public void Action()
        {
            
            this.WalkIn();
            this.SitDown();
            this.Think();
        }
    }

    public class Waiter
    {
        public void Action(Customer customer, OrderEventArgs e)
        {
            Console.WriteLine("I will serve you dish-{0}",e.DishName);
            double price = 10;
            switch(e.Size)
            {
                case "small":
                    price = price * 0.5;
                    break;
                case "large":
                    price = price * 1.5;
                    break;
                default:
                    break;
            }

            customer.Bill += price;
        }
    }

}

  • 写回答

1条回答 默认 最新

  • 於黾 2022-01-19 16:09
    关注

    1.this.orderEventHandler.Invoke(this,e)就是直接执行事件函数,这里没有触发什么事。
    2.this就是当前类的实例呀,比如按钮点击事件,如果你有许多动态布置的按钮,功能类似,但是行号不同,那肯定是要给所有按钮挂载同一个回调函数,而不是每个按钮写个函数;当函数执行时,就需要获取事件函数里的参数sender,来判断到底是哪个按钮被点击了。
    3.一个事件可以被注册多次,类似往list里面add元素一样,当事件函数调用时,会按顺序调用所有注册过的回调函数。+=就是增加一个挂载,-=就是不想事件继续执行了,去掉挂载

    评论

报告相同问题?

问题事件

  • 创建了问题 1月19日

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?