据说这是一个面试题。我刚开始学的时候不怎么理解,只简单的认为委托是可以将方法作为参数传入另一个方法中的,当你的参数需要一个方法的时候就可以使用委托。
委托是一种特殊的数据类型,事件是对象,本来没有可比性,又偏偏喜欢这样问。。
但是,反编译之后会发现事件是私有类型的委托,并且有两个方法,add,remove方法。
因此事件还只能供内部调用,而且,add方法不会将之前的调用覆盖,所以事件是相对安全的。
如下代码:
class Program
{
static void Main(string[] args)
{
Say.DgSayHi dsh = Goat.SayHi;
//Say.EventSay es = Goat.SayHi;//报错,不存在类型名EventSay
dsh = Cow.SayHi;//容易被覆盖
dsh();
//Console.WriteLine(str);
Console.WriteLine("==================================");
//Say.EventSay es += new DgSayHi(Goat.SayHi);X 说明事件是一个对象,而不是类型
Say.EventSay += new Say.DgSayHi(Dog.SayHi);
//Say.EventSay("小狗");//报错, 事件“Say.EventSay”只能出现在 += 或 -= 的左边
//(从类型“Say”中使用时除外)
Say.EventSay += new Say.DgSayHi(Cow.SayHi);
Say.GoSay();
Console.ReadKey();
}
}
class Say
{
public delegate void DgSayHi();//声明一个代理
public static event DgSayHi EventSay;//仅仅相当于一个字段的声明
public static void GoSay()
{
//触发事件
EventSay?.Invoke();
}
}
//反编译后
class Goat
{
public static void SayHi()
{
Console.WriteLine("山羊是咩咩叫");
}
}
class Dog
{
public static void SayHi()
{
Console.WriteLine("小狗是汪汪叫");
}
}
class Cow
{
public static void SayHi()
{
Console.WriteLine("老牛是哞哞叫");
}
}