c#应用程序中的事件语法与委托语法

时间:2015-05-04 09:24:48

标签: c# .net events syntax delegates

我搜索了the use of event syntax and its importance in c# code。所以我发现了这些优点:

  1. 无法直接分配事件(我们不会有人删除所有以前的订阅的风险,与代理语法一样
  2. 没有外部用户可以举起活动
  3. 我写这个片段是为了更多地理解以上几点:

    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; }
        }
    }
    

    第一点很清楚:我不能直接指定一个事件。但我不理解第二个,即使在我的代码中,我也可以从课外访问该事件并提升它。

    那么,事件语法如何防止不需要的用户引发事件?

2 个答案:

答案 0 :(得分:3)

  

即使在我的代码中,我也可以从课外访问该事件并将其提升

不,你不能。

你可以打电话

p.OnChange()

因为OnChange是一个简单的属性,但你无法调用

pubevent.OnchangeEvent()

因为OnchangeEvent是一个事件。

编译器会抱怨

  

事件'UserQuery.PubEvent.OnchangeEvent'只能出现在+ =或 - =的左侧(除非在'UserQuery.PubEvent'类型中使用)

因此,您只能在OnchangeEvent课程内拨打PubEvent,这正是您在Raise方法中所做的。 OnchangeEvent无法从外部提升。

答案 1 :(得分:2)

您在班级中定义了一个引发事件的方法。

如果此方法是公开的,任何人都可以调用该方法。

事件系统会阻止pubevent.OnchangeEvent(...)

之类的内容