C#一些知识点:委托和事件的区别
2024-10-10 13:40:21
在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");
}
}
}
最新文章
- 在MVC的项目中访问静态页面
- 用Js+css3实现图片旋转,缩放,裁剪,滤镜
- SPOJ Pouring Water
- 【转】makefile语法规则
- 【PythonChallenge】Level 4
- Android - Error parsing XML: unbound prefix
- 续前篇---数据挖掘之聚类算法k-mediod(PAM)原理及实现
- [置顶] ios App 中嵌入应用商店
- ##DAY9 UITabBarController
- 剑指offer 数字在排序数组中出现的次数
- BZOJ 3938 Robot
- sql优化总结
- Redis与SpringBoot整合
- Git基础使用教程
- mysql 存儲emjoy表情是報錯Incorrect string value:
- 优化网站设计(十):最小化JAVASCRIPT和CSS
- slot是标签的内容扩展,也就是说你用slot就可以在自定义组件时传递给组件内容,组件接收内容并输出
- 安装Centos7时提示 /dev/root does not exits
- SQL字符串分割解析
- Graham求凸包模板
热门文章
- 使用Jquery promise 动态引入js文件
- LA 4119 (差分数列 多项式) Always an integer
- 在web.config里使用configSource分隔各类配置
- Centos6.5下编译安装ACE6.0
- Docker管理面板Crane开源了!
- 《Python 学习手册4th》 第四章 介绍Python对象类型
- Oracle中错误代码ORA-02292 违反了完整性约束条件解决
- netty的入门
- quick-x在windows平台打包加密文件
- 内核源码分析之linux内核栈(基于3.16-rc4)