C#中的事件和委托

1.C#中的事件和委托的作用?
事件代表一个组件能够被关注的一种信号,比如你的大肠会向你发出想拉屎的信号,你就可以接收到上厕所。
委托是可以把一个过程封装成变量进行传递并且执行的对象,比如你上蹲坑和上坐马桶拉屎的方式是不一样的,但是你的大脑不需要知道两种方式的不同,只需要在蹲坑的时候获取身体用于蹲位姿势的委托进行调用拉屎,在坐马桶的时候获取坐姿的委托进行调用拉屎。

2.他们之间的关系?
委托是一种类型,事件是一种成员,就相当于public int Age {get;set;}这个属性中,int就是类型,Age是一个成员,public event EventHandler Push;这个事件中EventHandler就是委托类型,Push是事件他是一个成员。

3.什么情况使用委托和事件?
事件是组件中的抽象概念,同样包括状态和操作也是组件中的概念,对应到C#里面就是属性和方法。所以像控件之类的组件都会有事件。而委托代表一个代码的执行过程,C#3.0引入linq以后,用的就非常频繁了。

4.但是用事件的方式来调用的话有什么好处?
事件是一种封装,就好像属性会封装字段一样,可以把定义和实现隔离开来,给你举个例子就是DateTime实际上你看那么多属性,其实里面只有一个字段存储时间,各种日期啊年啊属性都是根据这个时间算出来的。事件也把内部类型为一个委托的字段封装起来,这样在类的外部就只能使用事件来注册或者注销事件关注,而不能引发事件。就好像你拉不拉屎不由其他人控制一样。

5.添加了委托一定要再定义事件来调用么?
看情况,你可以不用属性封装字段,但是在代码设计上来说,或者面向组件设计上来说,封装是一种设计原则,你学过设计模式,或者参与过大型系统的设计就会很容易理解这点。

6.什么情况下只要使用委托就可以,什么情况下必须配合事件使用?
一般情况下建立组件模型都使用事件

要理解事件,首先你要清楚理解委托的用处和本质。然后再去探究事件。
事件从本质上来说是委托,不过在使用上比委托多了一个限制,事件只能在定义事件的类内部被调用,
而委托可以在任意方法中被调用(难就难在理解这句)。
面向对象思想编程的一个特点就是尽可能的在软件中反应现实世界的关系和特点。
我们基本上可以说:事件是委托,委托是方法指针,在调用委托的时候跟调用方法是一样的。
一般来说,这个限制正好用在封装组件类的时候体现了封装特性。

C#中,事件委托是支持事件驱动编程的关键概念。委托是一种类型,它定义了可由方法实现的参数列表返回类型。委托类似于其他语言中的函数指针,但它们是面向对象的、类型安全的。事件是基于委托的,它是委托的一种特殊类型,用于提供一种通知机制,允许一个对象通知其他对象某个事情已经发生。 使用委托事件通常遵循以下步骤: 1. 定义委托:首先,你需要定义一个委托类型,它指定了事件处理方法的签名。 ```csharp public delegate void MyEventHandler(object sender, EventArgs e); ``` 2. 声明事件:在类中,你可以声明一个事件,使用前面定义的委托类型。 ```csharp public event MyEventHandler MyEvent; ``` 3. 触发事件:在需要触发事件的类的方法中,你可以调用这个事件,通知订阅者该事件已发生。 ```csharp protected virtual void OnMyEvent(EventArgs e) { MyEvent?.Invoke(this, e); } ``` 4. 订阅事件:其他对象可以通过订阅事件来接收通知。这通常在对象初始化时完成。 ```csharp MyClass myObject = new MyClass(); myObject.MyEvent += new MyEventHandler(MyEventMethod); ``` 5. 实现事件处理方法:你需要在订阅者对象中实现一个方法来处理事件。 ```csharp private void MyEventMethod(object sender, EventArgs e) { Console.WriteLine("Event received!"); } ``` 6. 取消订阅事件:当不再需要接收事件通知时,应该取消订阅,以避免内存泄漏。 ```csharp myObject.MyEvent -= new MyEventHandler(MyEventMethod); ``` 请注意,从C# 6.0开始,你可以使用lambda表达式来订阅事件,这样代码更加简洁。 ```csharp myObject.MyEvent += (sender, e) => Console.WriteLine("Event received!"); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值