亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#中事件只能在內(nèi)部調(diào)用的原因分析

 更新時(shí)間:2021年11月26日 08:43:28   作者:cavalier23  
事件(Event)?基本上說是一個(gè)用戶操作,如按鍵、點(diǎn)擊、鼠標(biāo)移動(dòng)等等,或者是一些提示信息,如系統(tǒng)生成的通知。應(yīng)用程序需要在事件發(fā)生時(shí)響應(yīng)事件,這篇文章主要介紹了C#中事件為什么只能在內(nèi)部調(diào)用,需要的朋友可以參考下
在學(xué)習(xí)C#中委托和事件時(shí),產(chǎn)生一個(gè)疑問,類中定義的事件在類內(nèi)部可以直接調(diào)用,而在類外部,事件卻只能添加或移除委托方法
比如下面這段代碼,類Customer中定義了一個(gè)委托 Order ,Customer內(nèi)部可以直接調(diào)用 Order.Invoke()
public class Customer
    {
     	// 定義事件
        public event  OrderEventHandler Order;
        public string? name;
        public float? price;
        protected void onOrder(OrderEventArgs orderEventArgs)
        {
            if(Order != null)
            {
                Order.Invoke(this, orderEventArgs);
            }
        }
     ......
而在類的外部,只能添加或移除委托方法,不能調(diào)用Order.Invoke(),下面代碼中customer.Order.Invoke()會(huì)報(bào)錯(cuò)。
public class Program{
        public static void Main(string[] args)
        {
            var customer = new Customer();
            customer.name = "1";
            Waiter waiter = new Waiter();
            customer.Order += waiter.Serve;
           //  customer.Order.Invoke() 這樣寫無法編譯
            customer.Think();
            customer.Pay();
        }
    }
細(xì)看劉鐵猛老師的《C#入門詳解》后,才明白原來這是C#語法糖讓我產(chǎn)生的誤解,在定義事件時(shí),
下面這行代碼是常見的定義方式,這是一種簡明的定義方法
// 事件的簡明定義方式
public event  OrderEventHandler Order;
而C#中事件完整的定義方式是這樣:
        private OrderEventHandler orderEventHandler;//委托,使用private 修飾
        public event  OrderEventHandler Order // 事件,對(duì)委托方法進(jìn)行增減
        {
            add
            {
                this.orderEventHandler += value;
            }
            remove 
            { 
                this.orderEventHandler -= value; 
            }
        }
使用完整寫法定義事件后,在內(nèi)部調(diào)用也不能用事件Order去調(diào)用了,要用委托去調(diào)用
     protected void onOrder(OrderEventArgs orderEventArgs)
        {
            if(this.orderEventHandler != null)
            {
                // 調(diào)用委托
                this.orderEventHandler.Invoke(this, orderEventArgs);
            }
        }
可以看到,我們真正調(diào)用的委托使用private修飾,是私有的,所以只能在內(nèi)部調(diào)用,而事件(event)則是對(duì)私有的委托進(jìn)行了包裝,實(shí)現(xiàn)對(duì)委托方法的增加或移除。
剛學(xué)C#,不知道說清楚沒。。。

到此這篇關(guān)于C#中事件為什么只能在內(nèi)部調(diào)用的文章就介紹到這了,更多相關(guān)C#事件內(nèi)部調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論