C#一些知识点:委托和事件的区别

在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");
}
}
}
上一篇:java 22 - 20 多线程之线程池


下一篇:java 22 - 17 多线程之等待唤醒机制(接16)