在C#中,委托和事件是比较容易混淆的两个知识点,本篇博客就记录一下委托和事件之间的区别。
定义上的区别
委托:委托实际上是一个类,用来表示一个函数,可以理解为C++中的函数指针。
事件:事件是一个修饰符,用来修饰一个委托类型的属性,表示该委托的部分功能被限制了。
我们可以这么理解:委托是类,定义了委托后,就可以像使用类一样的来使用这个委托,而事件修饰了委托后则是表示限制这个委托的部分功能,使其满足作为事件的规则。
那么事件究竟限制了委托的什么功能呢?主要是下面的这两个限制:
调用的限制
委托的调用没有限制,可以在任意的地方进行调用,而事件修饰过的委托只能在定义自己的类中进行调用(注意连子类都不允许调用),如下:
using System; namespace Study
{
class Program
{
static void Main(string[] args)
{
new App(); Console.Read();
}
} public delegate void Foo(); public class Test
{
public Foo foo1; public event Foo foo2; public Test()
{
foo1 += Func;
foo1(); foo2 += Func;
foo2();
} public void Func()
{
Console.WriteLine("Test Func");
}
} public class App
{
public App()
{
Test test = new Test(); test.foo1(); test.foo2();//这个会报错
}
}
}
注册的限制
委托可以使用“=”、“+=”、“-=”三种符号来表示赋值,添加和移除一个函数,而事件修饰过的委托在自己的类中也可以使用这三个符号(注意子类也属于外部的类),而在外部的类中时则只能使用“+=”和“-=”来添加移除函数,不能使用“=”进行赋值,下面我们来看一个具体的例子:
using System; namespace Study
{
class Program
{
static void Main(string[] args)
{
new App(); Console.Read();
}
} public delegate void Foo(); public class Test
{
public Foo foo1; public event Foo foo2; public Test()
{
foo1 = Func;
foo1 += Func;
foo1(); foo2 = Func;
foo2 += Func;
foo2();
} public void Func()
{
Console.WriteLine("Test Func");
}
} public class App
{
public App()
{
Test test = new Test(); test.foo1 = Func;
test.foo1 += Func;
test.foo1(); test.foo2 = Func;//这个会报错
test.foo2 += Func;
test.foo2();//这个会报错
} public void Func()
{
Console.WriteLine("App Func");
}
}
}