在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");
}
}
}

最新文章

  1. 在MVC的项目中访问静态页面
  2. 用Js+css3实现图片旋转,缩放,裁剪,滤镜
  3. SPOJ Pouring Water
  4. 【转】makefile语法规则
  5. 【PythonChallenge】Level 4
  6. Android - Error parsing XML: unbound prefix
  7. 续前篇---数据挖掘之聚类算法k-mediod(PAM)原理及实现
  8. [置顶] ios App 中嵌入应用商店
  9. ##DAY9 UITabBarController
  10. 剑指offer 数字在排序数组中出现的次数
  11. BZOJ 3938 Robot
  12. sql优化总结
  13. Redis与SpringBoot整合
  14. Git基础使用教程
  15. mysql 存儲emjoy表情是報錯Incorrect string value:
  16. 优化网站设计(十):最小化JAVASCRIPT和CSS
  17. slot是标签的内容扩展,也就是说你用slot就可以在自定义组件时传递给组件内容,组件接收内容并输出
  18. 安装Centos7时提示 /dev/root does not exits
  19. SQL字符串分割解析
  20. Graham求凸包模板

热门文章

  1. 使用Jquery promise 动态引入js文件
  2. LA 4119 (差分数列 多项式) Always an integer
  3. 在web.config里使用configSource分隔各类配置
  4. Centos6.5下编译安装ACE6.0
  5. Docker管理面板Crane开源了!
  6. 《Python 学习手册4th》 第四章 介绍Python对象类型
  7. Oracle中错误代码ORA-02292 违反了完整性约束条件解决
  8. netty的入门
  9. quick-x在windows平台打包加密文件
  10. 内核源码分析之linux内核栈(基于3.16-rc4)