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)文章
基于Unity Line Renderer組件的常用屬性說明
這篇文章主要介紹了基于Unity Line Renderer組件的常用屬性說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
C#從windows剪貼板獲取并顯示文本內(nèi)容的方法
這篇文章主要介紹了C#從windows剪貼板獲取并顯示文本內(nèi)容的方法,涉及C#操作剪貼板的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Winform實(shí)現(xiàn)抓取web頁面內(nèi)容的方法
這篇文章主要介紹了Winform實(shí)現(xiàn)抓取web頁面內(nèi)容的方法,代碼只有短短幾行,但是功能很實(shí)用,需要的朋友可以參考下2014-09-09
淺析WPF中常用屬性的相關(guān)概念和應(yīng)用
在WPF開發(fā)中,經(jīng)常聽到各種屬性,如:依賴屬性,附加屬性,CLR屬性,那這些不同類型的屬性,具體又有什么作用呢,下面就跟隨小編一起來學(xué)習(xí)一下吧2024-03-03

