委托与事件 机制
.Net笔试题1

.Net笔试题1:说说什么叫字符串不可变?string s="abc";s="123"字符串s不就变了吗?答:String 对象是不可改变的。
每次使用System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。
String是不可变的。
在这段代码中,s原先指向一个String对象,内容是 "abc",然后我们将s指向"123",那么s所指向的那个对象是否发生了改变呢?答案是没有。
这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"123",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
扩展:在需要对字符串执行重复修改的情况下,与创建新的String 对象相关的系统开销可能会非常昂贵。
如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder 类。
例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder类可以提升性能。
.net笔试题2:BS与CS的联系与区别?答:C/S是Client/Server的缩写。
客户端需要安装专用的客户端软件。
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器。
在这种结构下,用户界面完全通过浏览器实现,一部分事务逻辑在前端实现,但是主要逻辑在服务器端实现。
浏览器通过Web Server 同数据库进行数据交互。
C/S 与B/S 区别:1).硬件环境不同:C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.B/S 一般建立在广域网之上的, 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行。
2).对安全要求不同C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。
js中的事件委托(事件代理)详解

js中的事件委托(事件代理)详解本⽂转载:js中的事件冒泡、事件委托是js 中⼀些需要注意的⼩知识点,这⾥结合转载⽂章总结⼀下:事件冒泡:JS中当出发某些具有冒泡性质的事件是,⾸先在触发元素寻找是否有相应的注册事件,如果没有再继续向上级⽗元素寻找是否有相应的注册事件作出相应,这就是事件冒泡。
事件委托:利⽤事件冒泡的特性,将本应该注册在⼦元素上的处理事件注册在⽗元素上,这样点击⼦元素时发现其本⾝没有相应事件就到⽗元素上寻找作出相应。
这样做的优势有:1.减少DOM操作,提⾼性能。
2.随时可以添加⼦元素,添加的⼦元素会⾃动有相应的处理事件。
转载⽂章内容:起因:1、这是前端⾯试的经典题型,要去找⼯作的⼩伙伴看看还是有帮助的;2、其实我⼀直都没弄明⽩,写这个⼀是为了备忘,⼆是给其他的知其然不知其所以然的⼩伙伴们以参考;概述:那什么叫事件委托呢?它还有⼀个名字叫事件代理,JavaScript⾼级程序设计上讲:事件委托就是利⽤事件冒泡,只指定⼀个事件处理程序,就可以管理某⼀类型的所有事件。
那这是什么意思呢?⽹上的各位⼤⽜们讲事件委托基本上都⽤了同⼀个例⼦,就是取快递来解释这个现象,我仔细揣摩了⼀下,这个例⼦还真是恰当,我就不去想别的例⼦来解释了,借花献佛,我摘过来,⼤家认真领会⼀下事件委托到底是⼀个什么原理:有三个同事预计会在周⼀收到快递。
为签收快递,有两种办法:⼀是三个⼈在公司门⼝等快递;⼆是委托给前台MM代为签收。
现实当中,我们⼤都采⽤委托的⽅案(公司也不会容忍那么多员⼯站在门⼝就为了等快递)。
前台MM收到快递后,她会判断收件⼈是谁,然后按照收件⼈的要求签收,甚⾄代为付款。
这种⽅案还有⼀个优势,那就是即使公司⾥来了新员⼯(不管多少),前台MM也会在收到寄给新员⼯的快递后核实并代为签收。
这⾥其实还有2层意思的:第⼀,现在委托前台的同事是可以代为签收的,即程序中的现有的dom节点是有事件的;第⼆,新员⼯也是可以被前台MM代为签收的,即程序中新添加的dom节点也是有事件的。
C#基础知识学习之?委托(delegate)与事件(event)之间的介绍

C#基础知识学习之✨委托(delegate)与事件(event)之间的介绍委托(delegate) 与事件(event)前言在之前的文章里介绍了C#中的委托(delegate)(Action、Func、Predicate)的基本含义及用法那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的事件(event)事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下什么是事件以及事件与委托的区别委托和事件的定义委托在这里再说一遍委托跟事件的简单定义(没有搜到特别准确的,都是大概定义,理解万岁)委托:delegate 是一种可用于封装命名或匿名方法的引用类型。
委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。
委托是一种动态调用方法的类型,属于引用型。
委托是对方法的抽象和封装。
委托对象实质上代表了方法的引用(即内存地址)委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以把多个方法链接在一起。
这样,在事件触发时可同时启动多个事件处理程序。
委托签名不需要与方法精确匹配。
事件事件:事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。
如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法。
事件表示C#中已定义的一个对象,即处理通知过程的对象通常,每个事件的发生都会产生发送方和接收方。
在.net框架中,事件是将事件发送者(触发事件的对象)与事件接受者(处理事件的方法)相关联的一种代理类,即事件机制是通过代理类来实现的。
当一个事件被触发时,由该事件的代理来通知(调用)处理该事件的相应方法委托和事件的区别简单说了一下两者的定义,眼神好的小伙伴这时候就会发现,事件的说明里有提到一句话:“事件也可以算一种特殊的委托”,这句话不是特别准确,但是也不妨可以这样理解。
C_窗体中Invoke和BeginInvoke方法详解

在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法。
一、为什么Control类提供了Invoke和BeginInvoke机制?关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。
1、windows程序消息机制Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵。
这个消息泵让windows 程序生生不息。
Windows GUI程序的消息循环Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源。
这里的while 循环使用了GetMessage()这个方法,这是个阻塞方法,也就是队列为空时方法就会被阻塞,从而这个while循环停止运动,这避免了一个程序把cpu无缘无故地耗尽,让其它程序难以得到响应。
当然在某些需要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些3d游戏或者及时战略游戏中,一般会使用PeekMessage()这个方法,它不会被windows阻塞,从而保证整个游戏的流畅和比较高的帧速。
这个主线程维护着整个窗体以及上面的子控件。
当它得到一个消息,就会调用DispatchMessage 方法派遣消息,这会引起对窗体上的窗口过程的调用。
窗口过程里面当然是程序员提供的窗体数据更新代码和其它代码。
2、dotnet里面的消息循环public static void Main(string[] args){Form f = new Form();Application.Run(f);}Dotnet窗体程序封装了上述的while循环,这个循环就是通过Application.Run方法启动的。
3、线程外操作GUI控件的问题如果从另外一个线程操作windows窗体上的控件,就会和主线程产生竞争,造成不可预料的结果,甚至死锁。
C#事件(event)解析

C#事件(event)解析C#事件(event)解析事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂。
而这些东西却往往又是编程中常用且非常重要的东西。
大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来。
先来看看事件编程有哪些好处。
在以往我们编写这类程序中,往往采用等待机制,为了等待某件事情的发生,需要不断地检测某些判断变量,而引入事件编程后,大大简化了这种过程:- 使用事件,可以很方便地确定程序执行顺序。
- 当事件驱动程序等待事件时,它不占用很多资源。
事件驱动程序与过程式程序最大的不同就在于,程序不再不停地检查输入设备,而是呆着不动,等待消息的到来,每个输入的消息会被排进队列,等待程序处理它。
如果没有消息在等待,则程序会把控制交回给操作系统,以运行其他程序。
- 事件简化了编程。
操作系统只是简单地将消息传送给对象,由对象的事件驱动程序确定事件的处理方法。
操作系统不必知道程序的内部工作机制,只是需要知道如何与对象进行对话,也就是如何传递消息。
有了这么多好处,看来我们的确有必要掌握它。
俗话说:“难了不会,会了不难”。
就让我们一步一步开始吧...要讲事件,必然要讲到委托(delegate)。
它们之间的关系可以通过一个浅显的比方来说明,这个比方可能不是十分恰当。
比如你要租一个房屋,这是一个事件,那么委托就是房屋租赁中介,当你把租房子的消息告知中介后,中介就会产生出一套符合你要求的房屋租赁方案来。
再由中介执行这套方案,你便租得了这个房屋,即事件被处理了。
当然你也可以不通过中介,直接找房东,但如果没有互联网等工具,你如何得到谁出租房屋的信息?话题扯远了。
委托(delegate)委托可以理解成为函数指针,不同的是委托是面向对象,而且是类型安全的。
关于委托的理解,可以参考我的另一篇文章《C#委托之个人理解》。
Unity+C#游戏开发接口,委托与事件

游戏开发第五章接口,委托与目录 CONTENTS五.一接口零一五.二委托零二五.三零三内容简述"接口"理解为就是定义一套标准,然后由实现类来具体实现其地方法,接口就是一组类地抽象。
"委托"理解为"方法地抽象",也就是说定义一个方法地模板,至于这个方法具体是怎么样地,就由方法自己去实现。
是用户操作,例如:按键,点击,鼠标移动等。
或者某些,例如:系统生成地通知。
应用程序需求响应发生时。
五.一接口接口(interface)是C#地一种数据类型,属于引用类型。
一个接口定义一个协定。
接口可以包含方法,属,与索引器,接口本身不提供它所定义地成员地实现,接口只指定实现该接口地类或结构需要提供地成员。
实现某接口地类需要遵守该接口定义地协定,即需要提供接口成员地实现。
五.一.一 . 接口地定义一.定义接口是指定一组函数成员而不实现成员地引用类型,其它类型与接口可以继承接口。
二.特点通过接口可以实现多重继承,接口里面地方法都需求由外面接口实现去实现方法体,那么其修饰符必然是public。
接口成员不能有new,static,abstract,override,virtual修饰符。
接口只包含成员地签名,接口没有构造函数,所有不能直接使用new对接口行实例化。
C#是单继承,接口是解决C#里面类可以同时继承多个基类地问题。
五.一.二接口地使用接口地声明在C#,声明接口使用interface关键字,一般形式如下:[访问修饰符] interface 接口名[ : 基接口列表]{//接口成员}说明:接口成员可以是属,方法,索引器与,不能包含字段,构造函数等。
所有接口成员隐式地具有了public访问修饰符,因此,接口成员不能添加任何访问修饰符。
接口主要用来定义一个规则,让企业内部或行业内部地软件开发员按标准去实现应用程序地功能。
因此,继承接口地类或结构需要实现接口地所有属,方法,索引器与,继承接口地方法与继承类相似 接口地继承接口也可以继承其它接口,而接口可以多继承,即接口可以从多个接口继承,基接口名之间用逗号分隔。
委托和事件的区别

委托和事件的区别(讲的很详细)--转委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。
它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。
本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
将方法作为方法的参数我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语:public void GreetPeople(string name) {// 做某些额外的事情,比如初始化之类,此处略EnglishGreeting(name);}public void EnglishGreeting(string name) {Console.WriteLine("Morning, " + name);}暂且不管这两个方法有没有什么实际意义。
GreetPeople用于向某人问好,当我们传递代表某人姓名的name参数,比如说“Jimmy”,进去的时候,在这个方法中,将调用EnglishGreeting方法,再次传递name参数,EnglishGreeting则用于向屏幕输出“Morning, Jimmy”。
现在假设这个程序需要进行全球化,哎呀,不好了,我是中国人,我不明白“Morning”是什么意思,怎么办呢?好吧,我们再加个中文版的问候方法:public void ChineseGreeting(string name){Console.WriteLine("早上好, " + name);}这时候,GreetPeople也需要改一改了,不然如何判断到底用哪个版本的Greeting问候方法合适呢?在进行这个之前,我们最好再定义一个枚举作为判断的依据:public enum Language{English, Chinese}public void GreetPeople(string name, Language lang){//做某些额外的事情,比如初始化之类,此处略swith(lang){case Language.English:EnglishGreeting(name);break;case Language.Chinese:ChineseGreeting(name);break;}}OK,尽管这样解决了问题,但我不说大家也很容易想到,这个解决方案的可扩展性很差,如果日后我们需要再添加韩文版、日文版,就不得不反复修改枚举和GreetPeople()方法,以适应新的需求。
委托和事件的直接理解

初学者在理解委托和事件时常常被msdn搞糊涂,为了让初学.net的人快速应用.net的委托和事件模型编程,我在这里主要是提出理解的关键,以下代码都可直接运行,先看下面的代码。
using System;namespace delegeteTest{class delegeteClass{public delegate void fHandler(int a); //关键-此行可以看成类的声明public fHandler f0;public void d(int a,int b ){int c=a+b;f0(c);}}class test{public void output(int mun){System.Console .WriteLine ("{0}",mun);}[STAThread]static void Main(string[] args){test t=new test ();delegeteClass dc=new delegeteClass ();dc.f0 =new delegeteTest.delegeteClass.fHandler (t.ou tput);//实例的初始化dc.d(2,3);}}}解释一下"关键": 实际上 public delegate void fHandler(int a);可以看成如下:class fHandler{.....}类内部由编译器自动完成,是一个sealed类通过反汇编可以看到,是一个类的声明,它检查加入自己的函数的信息,如,返回值和参数类型现在熟悉vc++的人可能感觉到public delegate void fHandler(int a);这句就象一个宏现在好了既然是个类的定义,那么也可以直接拿到命名空间下了using System;namespace delegeteTest{public delegate void fHandler(int a);//fHandler现在上升到了类的层次class delegeteClass{public fHandler f0;//声明了委托fHandler的实例f0;public fHandler f1;//也可以再声明一个fHandler类的实例f1;public void d(int a,int b ){int c=a+b;f0(c);}}class test{public void output(int mun){System.Console .WriteLine ("{0}",mun);}[STAThread]static void Main(string[] args){test t=new test ();delegeteClass dc=new delegeteClass ();dc.f0 =new delegeteTest.fHandler (t.output);//此行做相应的修改dc.d(2,3);}}}有以上可知public delegate void fHandler(int a)这行代码只能放在能够声明类的地方,自然fHandler.后面的函数都是静态方法了,如fHandler.Equals (...);那么fHandler到底声明了什么? 实际上是声明了函数的类型,既函数的有关信息(如返回值,参数类型)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Button1.Click+=new EventHandler(Button1_Click);-----------------@1
大家都熟悉的一段代码,Button1.Click是事件(也可以说是一条委托链),EventHandler 是委托,Button1_Click是订阅事件的人,也可以说是委托的人。
通过这样的机制,一个事件可以有多个订阅者,从而可以实现点击button可以响应多个方法。
委托,顾名思义,委托给别人。
事件,“发布者/订阅者” 模式,发布者发布一个事件,订阅者订阅这个事件,当事件触发时,就会通知订阅者。
通知这个过程是通过委托来实现的。
大家想象一下这个情景,经理有一个项目,计划A君负责美工方面,B君负责程序方面,将项目一分为二;于是一天,在用餐的时候告诉他们这个计划。
发布者:经理---------@2
订阅者订阅这个事件原因:A,B君是经理的部下 -------------@3
事件:经理分配了A,B一个项目-------------@4
触发事件的原因:经理有个计划----------------@5
通知方式(委托):”在用餐的时候告诉“方式----------------@6
public delegate void OneThing(object sender, CustomEventArgs e);定义一个委托,返回值为空,委托名OneThing,相当于@1中的EventHandler,有两个参数分别为触发事件的对象和事件信息。
Custom EventArgs必须继承于EventArgs
public class CustomEventArgs : EventArgs
{
public CustomEventArgs() //构造函数
{ }
}
声明事件public event OneThing DoThing;
那么要要定义一个触发事件的原因:假设当输入文本为“你们两个把这件事做完”(@5)就触发事件。
定义一个Text属性
public string Text
{
get
{
return _text;
}
set
{
_text = value;
if (_text == "你们两个把这件事做完")
this.DoThing(this, new CustomEventArgs());
else
Console.WriteLine("你没有触发事件");
}
}
一旦触发事件就要通过委托机制来告诉订阅者
DelegateExample de = new DelegateExample(); //DelegateExample 一个类,详见源代码de.DoThing +=new DelegateExample.OneThing(de.DoHalfThing);
de.DoThing += new DelegateExample.OneThing(de.DoOtherHalfThing);
当DoThing被触发时,就会委托给DohalfThing 和DoOtherHalfThing两个函数。
为这两个被委托的方法书写函数体
public void DoHalfThing(object sender, DelegateExample.CustomE ventArgs e)
{
Console.WriteLine("好的,我只做一半,另一半给别人做吧");
}
public void DoOtherHalfThing(object sender, DelegateExample.C ustomEventArgs e)
{
Console.WriteLine("好的,另一半就交给我好了");
}
注意其中的参数要和声明委托时相同
总的一个过程是,
输入“你们两个把这件事做完”,
触发事件DoThing
由于DoThing注册了事件处理事件(委托给)两个函数。
所以执行了两个函数。
所有代码
class DelegateExample
{
string _text;
public delegate void OneThing(object sender, CustomEventArg s e);
public event OneThing DoThing;
public string Text
{
get
{
return _text;
}
set
{
_text = value;
if (_text == "你们两个把这件事做完")
this.DoThing(this, new CustomEventArgs());
else
Console.WriteLine("你没有触发事件");
}
}
public class CustomEventArgs : EventArgs
{
public CustomEventArgs()
{ }
}
public void DoHalfThing(object sender, CustomEventArgs e)
{
Console.WriteLine("好的,我只做一半,另一半给别人做吧");
}
public void DoOtherHalfThing(object sender,CustomEventArgs e) {
Console.WriteLine("好的,另一半就交给我好了");
}
}
static void Main(string[] args)
{
#region委托与事件
DelegateExample de = new DelegateExample();
de.DoThing += new DelegateExample.OneThing(de.DoHalfThin g);
de.DoThing += new DelegateExample.OneThing(de.DoOtherHalf Thing);
string input = Console.ReadLine();
de.Text = input;
Console.ReadLine();
#endregion
}。