C#中事件只能在內(nèi)部調(diào)用的原因分析
更新時間:2021年11月26日 08:43:28 作者:cavalier23
事件(Event)?基本上說是一個用戶操作,如按鍵、點擊、鼠標(biāo)移動等等,或者是一些提示信息,如系統(tǒng)生成的通知。應(yīng)用程序需要在事件發(fā)生時響應(yīng)事件,這篇文章主要介紹了C#中事件為什么只能在內(nèi)部調(diào)用,需要的朋友可以參考下
在學(xué)習(xí)C#中委托和事件時,產(chǎn)生一個疑問,類中定義的事件在類內(nèi)部可以直接調(diào)用,而在類外部,事件卻只能添加或移除委托方法
比如下面這段代碼,類Customer中定義了一個委托 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()會報錯。
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)生的誤解,在定義事件時,
下面這行代碼是常見的定義方式,這是一種簡明的定義方法
// 事件的簡明定義方式
public event OrderEventHandler Order;
而C#中事件完整的定義方式是這樣:
private OrderEventHandler orderEventHandler;//委托,使用private 修飾
public event OrderEventHandler Order // 事件,對委托方法進行增減
{
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)則是對私有的委托進行了包裝,實現(xiàn)對委托方法的增加或移除。
剛學(xué)C#,不知道說清楚沒。。。
到此這篇關(guān)于C#中事件為什么只能在內(nèi)部調(diào)用的文章就介紹到這了,更多相關(guān)C#事件內(nèi)部調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在C#中使用OpenCV(使用OpenCVSharp)的實現(xiàn)
這篇文章主要介紹了在C#中使用OpenCV(使用OpenCVSharp)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
C#客戶端HttpClient請求認(rèn)證及數(shù)據(jù)傳輸
本文詳細(xì)講解了C#客戶端HttpClient請求認(rèn)證及數(shù)據(jù)傳輸,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
DevExpress實現(xiàn)自定義GridControl中按鈕文字內(nèi)容的方法
這篇文章主要介紹了DevExpress實現(xiàn)自定義GridControl中按鈕文字內(nèi)容的方法,需要的朋友可以參考下2014-08-08
c#使用ManagedWifi查看當(dāng)前Wifi信號并選擇wifi的示例
這篇文章主要介紹了c#使用ManagedWifi查看當(dāng)前Wifi信號并選擇wifi的示例,需要的朋友可以參考下2014-04-04

