2015-05-04 67 views
1

我已經查詢了約the use of event syntax and its importance in c# code。所以,我發現這些優點:c#應用程序中的事件語法與委託語法

  1. 不能直接指定事件(我們沒有一個人可以刪除以前所有訂閱的風險,與委託的語法
  2. 沒有外部用戶可以引發事件

我寫這個片段更明白上面這幾點:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace certiflibrary 
{ 
    public class Class1 
    { 
     public static void Main() 
     { 
      Pub p = new Pub(); 
      p.OnChange +=() => Console.WriteLine("First"); 
      p.OnChange +=() => Console.WriteLine("Second"); 
      p.OnChange =() => Console.WriteLine("Third"); 
      p.Raise(); 
      Console.ReadKey(); 
      Console.WriteLine(p.OnChange.GetInvocationList().Length); 
      Console.ReadKey(); 

      PubEvent pubevent = new PubEvent(); 
      pubevent.OnchangeEvent += (sender, e) => Console.WriteLine("Event Raised: {0}",e.Name); 
      pubevent.Raise(); 
      Console.ReadKey(); 
     } 
    } 

    public class Pub 
    { 
     public Action OnChange { get; set; } 

     public void Raise() 
     { 
     if(OnChange != null) 
     { 
      OnChange(); 
     } 
     } 
    } 

    public class PubEvent 
    { 

     public event EventHandler<SpecialArgs> OnchangeEvent = delegate { }; 

     public void Raise() 
     { 
      OnchangeEvent(this, new SpecialArgs("hello")); 
     } 
    } 

    public class SpecialArgs:EventArgs 
    { 
     public SpecialArgs(string _name) 
     { 
     Name= _name; 
     } 

     public string Name { get; set; } 
    } 
} 

第一點是明確的:我不能直接分配一個事件,但我不理解第二個,即使在我的代碼中,我也可以從課堂外訪問該事件並提出。

那麼,Event語法如何防止不需要的用戶引發事件?

回答

3

即使在我的代碼可以從類外面訪問活動,提高其

不,你不能。

你可以稱之爲

p.OnChange() 

因爲OnChange是一個簡單的屬性,但你不能叫

pubevent.OnchangeEvent() 

因爲OnchangeEvent是一個事件。

,編譯器將用

事件「UserQuery.PubEvent.OnchangeEvent」抱怨只能出現上的+ =或左手側 - =(從類型「內使用時除外UserQuery.PubEvent 「)

所以,你只能從PubEvent類中調用OnchangeEvent,而這正是你在Raise方法做什麼。 OnchangeEvent不能從外面提出。

2

您在課堂上定義了引發事件的方法。

如果此方法是公開的,則任何人都可以調用該方法。

事件系統,防止類似的事情pubevent.OnchangeEvent(...)