×

C 中的委托和事件_c 委托事件

前端技术网 前端技术网 发表于2024-01-14 01:25:57 浏览1014 评论0

抢沙发发表评论

一、C# 中的委托和事件

在 C#中的委托和事件中,我提出了两个为什么在类型中使用事件向外部提供方法注册,而不是直接使用委托变量的原因。主要是从封装性和易用性上去考虑,但是还漏掉了一点,事件应该由事件发布者触发,而不应该由客户端(客户程序)来触发。这句话是什么意思呢?请看下面的范例:

NOTE:注意这里术语的变化,当我们单独谈论事件,我们说发布者(publisher)、订阅者(subscriber)、客户端(client)。当我们讨论Observer模式,我们说主题(subject)和观察者(observer)。客户端通常是包含Main()方法的Program类。

C  中的委托和事件_c  委托事件

classProgram{

staticvoidMain(string[]args){

Publishserpub=newPublishser();

Subscribersub=newSubscriber();

pub.NumberChanged+=newNumberChangedEventHandler(sub.OnNumberChanged);

pub.DoSomething();//应该通过DoSomething()来触发事件

C  中的委托和事件_c  委托事件

pub.NumberChanged(100);//但可以被这样直接调用,对委托变量的不恰当使用

}

}

//定义委托

publicdelegatevoidNumberChangedEventHandler(intcount);

//定义事件发布者

publicclassPublishser{

privateintcount;

publicNumberChangedEventHandlerNumberChanged;//声明委托变量

//publiceventNumberChangedEventHandlerNumberChanged;//声明一个事件

publicvoidDoSomething(){

//在这里完成一些工作...

if(NumberChanged!=null){//触发事件

count++;

NumberChanged(count);

}

}

}

//定义事件订阅者

publicclassSubscriber{

publicvoidOnNumberChanged(intcount){

Console.WriteLine("Subscribernotified:count={0}",count);

}

}

上面代码定义了一个NumberChangedEventHandler委托,然后我们创建了事件的发布者Publisher和订阅者Subscriber。当使用委托变量时,客户端可以直接通过委托变量触发事件,也就是直接调用pub.NumberChanged(100),这将会影响到所有注册了该委托的订阅者。而事件的本意应该为在事件发布者在其本身的某个行为中触发,比如说在方法DoSomething()中满足某个条件后触发。通过添加event关键字来发布事件,事件发布者的封装性会更好,事件仅仅是供其他类型订阅,而客户端不能直接触发事件(语句pub.NumberChanged(100)无法通过编译),事件只能在事件发布者Publisher类的内部触发(比如在方法pub.DoSomething()中),换言之,就是NumberChanged(100)语句只能在Publisher内部被调用。

大家可以尝试一下,将委托变量的声明那行代码注释掉,然后取消下面事件声明的注释。此时程序是无法编译的,当你使用了event关键字之后,直接在客户端触发事件这种行为,也就是直接调用pub.NumberChanged(100),是被禁止的。事件只能通过调用DoSomething()来触发。这样才是事件的本意,事件发布者的封装才会更好。就好像如果我们要定义一个数字类型,我们会使用int而不是使用object一样,给予对象过多的能力并不见得是一件好事,应该是越合适越好。尽管直接使用委托变量通常不会有什么问题,但它给了客户端不应具有的能力,而使用事件,可以限制这一能力,更精确地对类型进行封装。

NOTE:这里还有一个约定俗称的规定,就是订阅事件的方法的命名,通常为“On事件名”,比如这里的OnNumberChanged。

二、.C#中的委托是什么事件是不是一种委托

分析如下:

1、委托是CTS(公共类型系统)规定的5种类型之一(类类型、结构类型、接口类型、枚举类型、委托类型)。

2、通俗的说,委托是这样一种类型:这种类型的实例,指向其它类型的方法。

委托主要就是提供间接调用、构建双向系统用的,他为消息模型和多线编程提供了基础。

3、再说说事件,事件并不是一种类型,它是一个方法,它是为了简化委托的注册而出现的。事件是一种委托,这是严重的误导!

拓展资料

1、我们知道委托是一个引用类型,所以它具有引用类型所具有的通性。它保存的不是实际值,而是保存对存储在托管堆(managedheap)中的对象的引用。那它保存的是对什么的引用呢?委托保存的是对函数(function)的引用。

2、对学过C/C++的人,是不是觉得跟函数指针很像呢!委托可以引用实例和静态(在VisualBasic中为Shared)方法,而函数指针只能引用静态方法。其实它们是有区别的,在非托管C/C++中,函数的地址就是一个内存地址。该地址不会携带任何额外的信息,例如函数期望的参数个数、参数类型、函数的返回值类型及函数的调用约定。总之,非托管C/C++中函数指针是非类型安全的。而.NET中的委托是类型安全的,委托会检测它所保存的函数引用是否和声明的委托匹配。

(资料来源:百度百科:委托)

三、什么是委托委托和事件是什么关系

简单的说,委托就是一个方法容器,可以加载多个具有相同签名的方法引用地址。调用委托相当于同时调用容器中的所有方法。委托可以将方法作为参数传递给方法。事件是特殊的代表

拓展资料

一、事件的定义是比较有意义的,会对一定的人群产生一定的影响。在物理学中,事件是由其时间和空间指定的时间和空间中的一个点。事件由信息子安排引发。事件又称随机事件,是概率论的基本概念之一。它是随机现象的表达,是一些基本事件组成的**。事件一般用大写字母A、B、C表示,表示事件A发生当且仅当A中包含的基本事件发生。

二、委托是定义方法类型的类,以便方法可以作为另一个方法的参数传递。这种将方法动态分配给参数的方法,可以避免程序中大量使用if else(switch)语句,使程序更具扩展性。使用委托,您可以将多个方法绑定到同一个委托变量。在调用这个变量时(这里用“call”这个词是因为这个变量代表一个方法),可以依次调用所有绑定的方法。

三、事件本身是一个委托。 c编译后,就是私有委托。添加和删除方法被添加。事件比委托有更深层次的控制,它规定它们只能在生产者内部调用。

四、什么是事件委托?

事件委托也称为事件委托。是 JavaScript中绑定事件的常用技术。顾名思义,“事件代理”是指将原本绑定在子元素上的响应事件委托给父元素,让父元素起到监听事件的作用。事件代理的原理是 DOM元素的事件冒泡。

五、举个通俗的例子:比如一个宿舍的学生同时到达,一种方式是让他们一个一个去取。另一种方式是将事情委托给宿舍负责人,让一个人出去把快递全部拿到,然后根据收件人的情况一个一个地分发给每个宿舍的学生;

在这里,接受快递是一件大事。每个学生指的是需要响应事件的DOM元素,出门收快递的宿舍长就是agent元素。因此,该元素确实与事件绑定。根据收件人分发快递的过程是在事件执行过程中,您需要确定当前响应事件应该匹配哪一个或几个代理元素。

六、当一个事件被触发时,它会在子元素和父元素之间传播。这种交流分为三个阶段。

(1)捕获阶段:从窗口对象到目标节点(从上层到下层)的传输称为“捕获阶段”,捕获阶段不会响应任何事件;

(2)目标阶段:在目标节点上触发,称为“目标阶段”

(3)冒泡阶段:将窗口对象从目标节点(从底层到顶层)导回,称为冒泡阶段。事件代理就是利用事件冒泡机制将内层需要响应的事件绑定到外层。

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

一、使用位置不同

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

二、使用符号不同

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

扩展资料:

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

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

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

2、事件简介

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

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

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

文章分享结束,C 中的委托和事件_c 委托事件和什么是委托委托和事件是什么关系的答案你都知道了吗?欢迎再次光临本站哦!