我搜索了the use of event syntax and its importance in c# code
。所以我发现了这些优点:
我写这个片段是为了更多地理解以上几点:
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; }
}
}
第一点很清楚:我不能直接指定一个事件。但我不理解第二个,即使在我的代码中,我也可以从课外访问该事件并提升它。
那么,事件语法如何防止不需要的用户引发事件?
答案 0 :(得分:3)
不,你不能。即使在我的代码中,我也可以从课外访问该事件并将其提升
你可以打电话
p.OnChange()
因为OnChange
是一个简单的属性,但你无法调用
pubevent.OnchangeEvent()
因为OnchangeEvent
是一个事件。
编译器会抱怨
事件'UserQuery.PubEvent.OnchangeEvent'只能出现在+ =或 - =的左侧(除非在'UserQuery.PubEvent'类型中使用)
因此,您只能在OnchangeEvent
课程内拨打PubEvent
,这正是您在Raise
方法中所做的。 OnchangeEvent
无法从外部提升。
答案 1 :(得分:2)
您在班级中定义了一个引发事件的方法。
如果此方法是公开的,任何人都可以调用该方法。
事件系统会阻止pubevent.OnchangeEvent(...)