A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© honeys天空s 中级黑马   /  2013-11-30 16:45  /  1968 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 V_John 于 2013-12-19 18:00 编辑

C#中的委托是什么?事件是不是一种委托?

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

19 个回复

正序浏览
C语言里面有个指针,应该不陌生吧,通过指针可以调用函数(面向对象里面称之为方法),但是指针是不太安全的,用不好会造成很严重的后果。所以C#是不支持指针的,但是,它也提供了一种构造来代替指针的功能,这就是委托。C#里面变量的传递可以通过传参和定义变量的访问级别来调用变量,但是要调用方法,就要用到委托。
事件不是委托,它是一种提醒机制,如窗体上的控件触发了单击事件,控件本身是不知道的,需要窗体提醒这个控件它的单击事件已经触发,控件就会去响应这一触发的事件。在事件里面调用方法就要使用委托,也就是说,事件不是委托,事件将委托封装起来了。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
委托是一种可以把引用存储为函数的类型。但它没有方法体、且使用关键字delegate进行声明。而它的返回类型和参数类型指定了它所接受的方法的类型。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
事件的本质就是委托,委托可以看成是存储方法名字的变量,存储的是和委托的类型相同的方法名字。而事件是对象实现的方式是委托,只是用envent修饰来修饰(目前你可以看成是特殊的委托)。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报

命名空间>类>方法
委托是类,事件是方法
回复 使用道具 举报
c#事件机制是基于委托实现的,因此首先要定义一个委托EventHandler:
public delegate void EventHandler(object from ,myEventArgs e)
System.EventArgs是包含事件数据的类的基类,在代码中可以直接使用EventArgs,myEventArgs是派生类。这里的from事件对象,e为事件的方法。
定义事件格式:event  事件委托名 事件名
然后再激活事件:事件名(事件对象,new一个委托名对象)
注意:在我们使用中的事件一般都是委托打包好的,拿来直接就可以用。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
获得正确答案的童鞋记得重新编辑帖子,将格式设置为已解决,版主会来加分的哦。否则,楼主是得不到技术分的。谢谢合作
回复 使用道具 举报
委托首先和类是一个级别的,接受委托对象,委托对象就是一个方法。事件是是受限制的委托。哈哈,自己理解的

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
委托是个特殊的类,可认为是一类方法的抽象,这类方法具有相同的参数和返回值类型。委托将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托有4个应用:1.更加灵活的方法调用;2.用于异步回调;3.多线程编程时,用委托来制定一个线程启动时调用的函数;4.C#中事件模型中指明处理特定事件的方法。委托本身也体现了面向对象的编程思想和封装性。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的指针。
委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和
(标准的event 方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自
己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate 就没法
进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事
件只能add、remove 自己,不能赋值。事件只能+=、-=,不能= 。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
事件是在对象中定义了一个事件对象,当这个事件发生时,就调用该类型的委托
比如定义一个委托 pulic void delegate Do(),无参数,返回值为void。
定义一个事件 public event Do Change。
当在对象中Change事件触发时,就调用委托Do类型的方法,只要满足Do的要求的方法都可以。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
首先给你解释一下委托是什么 委托是一个类,这个类保存了一个对象和这个对象的一个方法,所以当你调用这个委托的时候就是调用保存的对象的哪个方法,委托的意义就是这个意思,把调用委托实际是委托给了一个对象的一个方法  因为委托是一个类,所以他是定义在类级别上的,也就是和类同级别的  事件是一种类的成员,他同方法,字段,属性是一个级别的,所以它定义在类的内部,你可以很容易区分开. 和字段,属性一样,事件也有事件类型,比如一个叫Name的属性是String类型的,那么一个叫MouseMove的事件他是一个叫EventHandler的委托类型的  现在我想你应该清楚委托实际上是一个类,仅仅是定义了一个委托的样子,而事件则是保存了委托的实例,因为他是成员

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
就是用来传方法的。平常我们的方法或者函数只能用来传参数,有的时候一个方法可能需要另一个方法的支持,所以我们可以定义个委托来传这个方法。  需要注意的是,委托和你所要传的方法的返回值类型要一致,委托和C语言里的指针理解起来差不多大概。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
许杰 中级黑马 2013-11-30 20:38:07
7#
委托是C#中新加入的一个类型,可以把它想作一个和Class类似的一种类型,和使用类相似,使用一个委托时,需要两个步骤,首先你要定义一个委托,就像是定义一个类一样;然后,你可以创建一个或多个该委托的实例。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
委托是一个可以对方法进行引用的类,使用delegate关键字标记。委托用于将方法作为参数传递给其他方法,也可以定义回调方法。事件处理程序就是通过委托调用的方法。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
    委托是一种类型比较安全的对象,它指向以后会被调用的一个或这多个方法。通常委托类型的参数是方法名。
委托类型有3个重要的信息需要注意:委托所调用的方法的名称、方法的参数,方法的返回值

     委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
事件你可以把它理解为是一种特殊的委托。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
事件把委托封装了起来……我是这么理解的……Orz

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马