• 事件的基本使用


    事件的基本使用

    声明一个事件很简单,只需在声明一个委托对象时加上event关键字就行。如下:

    public delegate void PriceChangedHandler (decimal oldPrice, decimal newPrice);

    public class IPhone6 { public event PriceChangedHandler PriceChanged; }

    事件的使用和委托完全一样,只是多了些约束。下面是一个简单的事件使用例子:

    public delegate void PriceChangedHandler(decimal oldPrice, decimal newPrice);
    public class IPhone6 {
        decimal price;
        public event PriceChangedHandler PriceChanged;
        public decimal Price {
            get { return price; }
            set {
                if (price == value) return;
                decimal oldPrice = price;
                price = value;
                // 如果调用列表不为空,则触发。
                if (PriceChanged != null)
                    PriceChanged(oldPrice, price);
            }
        }
    }
    class Program {
        static void Main() {
            IPhone6 iphone6 = new IPhone6() { Price = 5288 };
            // 订阅事件
            iphone6.PriceChanged += iphone6_PriceChanged;
            // 调整价格(事件发生)
            iphone6.Price = 3999;
            Console.ReadKey();
        }
        static void iphone6_PriceChanged(decimal oldPrice, decimal price) {
            Console.WriteLine("年终大促销,iPhone 6 只卖 " + price + " 元, 原价 " + oldPrice + " 元,快来抢!");
        }
    }
    View Code

    运行结果:

    有人可能会问,如果把上面的event关键字拿掉,结果不是一样的吗,到底有何不同?

    没错可以用事件的地方就一定可以用委托代替。

    但事件有一系列规则和约束用以保证程序的安全可控,事件只有 += 和 -= 操作,这样订阅者只能有订阅或取消订阅操作,没有权限执行其它操作。如果是委托,那么订阅者就可以使用 = 来对委托对象重新赋值(其它订阅者全部被取消订阅),甚至将其设置为null,甚至订阅者还可以直接调用委托,这些都是很危险的操作,广播者就失去了独享控制权。

    事件保证了程序的安全性和健壮性。

  • 相关阅读:
    编译原理笔记 2
    编译原理笔记 1
    初步学习计算机图形学 [闫令琪]
    复杂 Web 前端的设计
    使用 GitHub Actions 部署 .Net 5 程序
    ES 2020 Optional Chain (可选链)
    2020 Web 前端学习记录
    WPF TreeView 支持多选
    linux (CentOS 7)报错:yum 命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”
    node.js 报错
  • 原文地址:https://www.cnblogs.com/XiaoRuLiang/p/12431472.html
Copyright © 2020-2023  润新知