2015-05-04 86 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(...)