C#里事件和委托有什么区别啊??

 我来答
由悠悠yoyo
高粉答主

2020-07-18 · 就这样吧。
由悠悠yoyo
采纳数:324 获赞数:306354

向TA提问 私信TA
展开全部

 一 、使用位置不同

事件只能在本类型内部“触发”,委托不管在本类型内部还是外部都可以“调用”。

 二、使用符号不同

在类的外部,事件只能用“+=”和“-=”去订阅/取消订阅,如果是委托的话还可以使用“=”。

扩展资料:

1、C#中事件机制的工作原理:

(1)将实际应用中需通过事件机制解决的问题对象注册到相应的事件处理程序上,表示今后当该对象的状态发生变化时,该对象有权使用它注册的事件处理程序。

(2)当事件发生时,触发事件的对象就会调用该对象所有已注册的事件处理程序。

2、事件简介

触发事件的对象称为事件发送者;接收事件的对象称为事件接收者。事件就是用户对窗口上各种组件的操作。

使用事件机制可以实现:当类对象的某个状态发生变化时,系统将会通过某种途径调用类中的有关处理这个事件的方法或者触发控件事件的对象就会调用该控件所有已注册的事件处理程序等。

在.net框架中,事件是将事件发送者(触发事件的对象)与事件接受者(处理事件的方法)相关联的一种代理类,即事件机制是通过代理类来实现的。当一个事件被触发时,由该事件的代理来通知(调用)处理该事件的相应方法。

lll112012
2021-06-16
知道答主
回答量:9
采纳率:0%
帮助的人:2.8万
展开全部

委托的本质,是一个,而事件,是委托这个类的一个私有变量加上两个公有方法(事件的+=和-=这两个公有方法,和委托实例的+=和-=功能上非常像,但并不是同一个东西),这是本质区别。

打个比方,string 也是一个类,而string s = "a",这个s是string这个类的一个变量(略有不恰当,为了方便直观理解,那么,委托是和string这个类同等的地位,而事件,是和s这个变量同等的地位)。

public delegate void myDel();相当于你创建了一个myDel的类,所以委托可以在任何地方创建,类需要实例化,所以委托需要实例化,要myDel m = ……;

申明一个事件 public event myDel myEvent;

事件myEvent类似于是一个myDel类型的一个变量,因为是变量,所以事件只能在类里面申明,不需要实例化,有点类似于上面的那个m。

既然myEvent(类似)和变量m都是myDel类型的一个变量,为什么还要弄一个事件这种东西出来,变量m不就可以实现事件的需求(监听,广播)吗?这里牵涉到了面向对象的一些设计理念,事件可以理解为委托实例m的一个约束版。

第一:委托实例m,哪里都可以用“+=”,“-=”,“=”三种方式,事件myEvent也可以用“+=”,“-=”,“=”三种方式,但是,事件的“=”必须要在申明他的类里面,才能用,外部,不能用,外部只需要关注注册“+=”和注销“-=”即可。因为外部如果可以用“=”,就会覆盖原有的其他注册进来的方法,这表明不安全,违背了封装性,外部的监听者,你只能管好自己是否监听,而不能因为你的监听误操作(“=”),覆盖了其他的未知监听者,所以在外部事件不允许用“=”。

第二:委托实例m,可以在任何地方调用,而事件myEvent,只能在申明他的类里面调用。这种限制,也是从面向对象的理念考虑。假设某个类(Class A)里面有一个事件,当这个类(Class A)的里面的某某属性(int b)发生了变化,然后发出通知,告诉所有的监听者。那么这个属性b,变没变,什么时候变,只能由A这个类自己知道,自己决定,自己触发,外部的任何类,无权过问,而委托的实例可以在任何地方调用,不符合这种封装性。

事件就是把委托实例的所有权利,都留给申明他的类,而只开放委托实例的注册和注销功能,给外部类。

事件最常用的场景,是用于广播变化给监听者,委托最常用的场景,是用于将方法当做参数进行传递(当然,委托也可以达到和事件一样的广播效果,不过没有事件那么安全)

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友eb0081a7e
2007-09-17 · TA获得超过1081个赞
知道小有建树答主
回答量:788
采纳率:0%
帮助的人:0
展开全部
事件和委托
事件可以理解为现实生活中发生的各种事情,例如老板拿了一堆文件放到秘书办公桌上,对秘书说帮我处理完这写报表,这就形成了一个委托,老板委托秘书帮他完成一份工作,

事实这份工作他也许已经早在以前就教给秘书怎么做了,但这次他还是交给秘书做尽管他自己可以做否则他请秘书而不干活就不如养一条人见人爱见谁跟谁跑的金毛啦,代码表示一下:

using System;
public class SamplesDelegate {
public delegate String myMessionDelegate( string myFile );
public class mySampleClass {
public String myWordFile( string myFile ) {
if ( myFile == "会议报告" )
return( "修改错别字并润色一下" );
if ( myInt == "项目调研" )
return( "修改错别字并转发给项目经理" );
return ( "修改错别字" );
}
public static String myFileSign ( string myFile ) {
if ( myFile ="会议报告" )
return( "会议" );
if ( myFile ="项目调研" )
return( "项目" );
return ( "一般文件" );
}
}
public static void Main() {
mySampleClass mySC = new mySampleClass();
myMessionDelegate myD1 = new myMessionDelegate( mySC.myWordFile);
myMessionDelegate myD2 = new myMessionDelegate( mySampleClass.myFileSign );
Console.WriteLine( "{0} 修改方法 {1}; 类型\"{2}\".", "会议报告", myD1( "会议报告"), myD2( "会议报告" ) );
Console.WriteLine( "{0} 修改方法 {1}; 类型\"{2}\".", "项目调研", myD1( "项目调研"), myD2( "项目调研" ) );
Console.WriteLine( "{0} 修改方法 {1}; 类型\"{2}\".", "一般文件", myD1( "一般文件" ), myD2( "一般文件" ) );
}

}
*/
秘书接到文件后 判断文件类型 并 回忆 老板交给他的处理方法并进行 处理

-------------------------------------------
using System;
namespace 委托
{
delegate int NumOpe(int a,int b); //委托声明
class Class1
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
NumOpe p1 = new NumOpe(c1.Add); //委托实例化
Console.WriteLine(p1(1,2)); //委托调用
Console.ReadLine();
}
private int Add(int num1,int num2)
{
return(num1+num2);
}
}
}
例中,委托NumOpe引用了方法Add。
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致:
1、参数个数、类型、顺序必须完全一致。
2、返回值必须一致。

在来一个
-------------------
using System;
namespace event_test
{
class DelegateEvent
{
public delegate void MyDelegate();
public event MyDelegate NotifyEveryOne;
public void Notify()
{
if(NotifyEveryOne != null)
{
System.Console.WriteLine("引发了事件!");
NotifyEveryOne(); //事件通知委托对象,委托对象调用实例化时作为参数的方法.
}
}
}
class clsA
{
public void DispMethodA()
{
System.Console.WriteLine("已经把事件NotifyEveryOne通知到ClassA!");
}
}
class clsB
{
public void DispMethodB()
{
System.Console.WriteLine("已经把事件NotifyEveryOne通知到ClassB!");
}
}
class clsTest
{
[STAThread]
static void Main(string[] args)
{
// 首先实例化一个事件源对象。
DelegateEvent eventSource = new DelegateEvent();
// 实例化事件的订户
clsA objA = new clsA();
clsB objB = new clsB();
// 使用委托把对象及其方法注册到事件中
eventSource.NotifyEveryOne +=new event_test.DelegateEvent.MyDelegate(objA.DispMethodA);
eventSource.NotifyEveryOne +=new event_test.DelegateEvent.MyDelegate(objB.DispMethodB);
eventSource.Notify();
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bladekk
推荐于2017-10-08 · TA获得超过129个赞
知道答主
回答量:86
采纳率:0%
帮助的人:0
展开全部
事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托.

通俗的讲,委托你可以在客户代码中直接调用委托来激发委托指向的函数,而事件不可以,事件的触发只能由服务代码自己触发

也就是说在你的代码里委托你不但可以安排谁是它的调用函数,还可以直接调用它,而事件不能直接调用,只能通过某些操作触发

你可以理解事件就是一个或多个委托,此话应该有误的吧,事件可以有多个事件处理函数,委托同样也可以是个多播委托
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
律云淦弘丽
2019-07-01 · TA获得超过3774个赞
知道大有可为答主
回答量:3166
采纳率:31%
帮助的人:165万
展开全部
事件是类在发生其被关注的事情时用来提供通知的一种方式。

使用事件,对象A可以将关于事件或已发生变化的信息通知其他对象B。

引发事件的对象称为事件发送方源。

捕获事件并对其作出响应的对象叫做事件接收方。
在事件通信中,发送方不知道哪个对象或方法将接收【处理】它引发的事件。故需要在发送方和接收方之间存在一个媒介【或类似
指针的机制】。.NET
Framework
定义了一个特殊的类型
(Delegate),该类型提供函数指针的功能。

事件使用委托来为触发时将调用的方法提供类型安全的封装。
这段话是我珍藏的,比较抽象。
为什么不能直接用委托代替事件?我个人觉得,在事件通讯这个模式下,这是规定好的:事件+=委托(方法)。如果按您的想法,直接委托+方法,那么接收方如何知道你到底干了什么事情,是双击了button,还是单击了一下窗体,又或者干了其他事情。首先没有方法知道,那么接收方调用哪个委托(方法)呢?
您好好看看刚开始的那段话,应该会有很大帮助。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式