| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1161 人关注过本帖
标题:委托怎么理解啊
只看楼主 加入收藏
mldark
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2006-9-5
收藏
 问题点数:0 回复次数:6 
委托怎么理解啊

委托怎么理解啊

搜索更多相关主题的帖子: 委托 
2006-11-24 17:22
xqyy
Rank: 1
等 级:新手上路
帖 子:221
专家分:0
注 册:2006-11-8
收藏
得分:0 

好比是两台机子连在一起,委托就是网线。


[url=http://www.][我乐表情库 www.]创建自己的表情库,表情包下载,个性签名,牛逼头像,经典小游戏,QQ皮肤下载,注册后还可以在线免费看电影[/url]
2006-11-24 18:32
bygg
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:乖乖的心中
等 级:版主
威 望:241
帖 子:13555
专家分:3076
注 册:2006-10-23
收藏
得分:0 
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
委托方法的使用可以像其他任何方法一样,具有参数和返回值。

飘过~~
2006-11-24 19:41
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
收藏
得分:0 
委托就是指向同一类型函数的指针(或引用).
例如,你用委托A定义了的事件B就相当于定义了一个参数是委托A类型的函数的函数B.而事件处理函数则是传递给函数B的函数.
把函数当做一个变量a,则委托是a的类型(有相同的返回类型及相同的参数)

说的有点拗口,仔细理解还是比较明白的.

实践、学习、再实践、再学习......
2006-11-24 19:48
tty1960
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2006-10-16
收藏
得分:0 
可不可以举个例子,比如调用Butten_click事件,剧说这也是委托,是不是呀,怎么调用
2006-11-24 21:33
IT浪子
Rank: 4
来 自:Nyist
等 级:贵宾
威 望:13
帖 子:402
专家分:20
注 册:2006-11-24
收藏
得分:0 

using System;

delegate void MyDelegate(string s);

class MyClass
{
public static void Hello(string s)
{
Console.WriteLine(" Hello,{0}!", s);
}

public static void Goodbye(string s)
{
Console.WriteLine(" Goodbye,{0}!", s);
}

public static void Main()
{
MyDelegate a, b, c, d;

// 创建引用 Hello 方法的
// 委托对象 a:
a = new MyDelegate(Hello);
// 创建引用 Goodbye 方法的
// 委托对象 b:
b = new MyDelegate(Goodbye);
// a 和 b 两个委托组成 c,
// c 将按顺序调用这两个方法:
c = a + b;
// 从组合委托中移除 a 而保留 d,
// 后者仅调用 Goodbye 方法:
d = c - a;

Console.WriteLine("Invoking delegate a:");
a("A");
Console.WriteLine("Invoking delegate b:");
b("B");
Console.WriteLine("Invoking delegate c:");
c("C");
Console.WriteLine("Invoking delegate d:");
d("D");
Console.ReadLine();
}
}
我不说了,说多了反而容易迷糊,就给你写个例子吧,应该可以看懂的,你执行下,


你不能让所有人都满意,因为不是所有人都是人!
2006-11-24 21:44
loveqq2004
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2006-8-28
收藏
得分:0 

最好是通过实例来理解

/// <summary>
/// 声明一个TextChanged委托,该委托有一个TextChangedEventArgs类型的参数作为数据的传递。
/// </summary>
/// <param name="e"></param>
public delegate void TextChangedHandler(TextChangedEventArgs e);

public partial class Form1 : Form
{
/// <summary>
/// 定义一个TextChanged类型的事件。
/// </summary>
public event TextChangedHandler TextChanged;

private string m_Text;
/// <summary>
/// Text属性
/// </summary>
public string Text
{
get { return m_Text; }
set
{
m_Text = value;
// 当前类的m_Text被修改的时候发布TextChanged事件。
OnTextChanged(m_Text);
}
}
/// <summary>
/// 发布TextChanged事件。
/// </summary>
/// <param name="text"></param>
private void OnTextChanged(string text)
{
if (TextChanged != null)
{
TextChanged(new TextChangedEventArgs(text));
}
}

public Form1()
{
InitializeComponent();
this.TextChanged += new TextChanged(Form1_TextChanged);
}
/// <summary>
/// 当发生了TextChanged事件之后的处理方法。
/// </summary>
/// <param name="e"></param>
void Form1_TextChanged(TextChangedEventArgs e)
{
MessageBox.Show(e.Text);
}
}

public class TextChangedEventArgs:EventArgs
{
private string m_Text;
public string Text
{
get{return m_Text;}
}

public TextChangedEventArgs(string text)
{
m_Text = text ;
}
}
上面的这个类是一个简单的WinForm下的Form窗口对象。在该类前面声明了一个TextChanged委托。其实委托就是一个回调函数的格式定义。下面我来解释一下上面这段代码的工作方式。

上面这段代码是微软程序种最标准的事件声明和发布的方式。在所有微软的控件中到处充斥这这种代码,如果你可以反编译微软的代码的话,你会看到非常非常多的On.....方法,这种以On开头的方法都是发布事件以及内部事件处理的方法。

那么怎样声明一个事件呢?这要看你要用这个事件做什么了,通常情况下我们使用事件发布我们当前对象的某个状态被改变了,已通知那些对这个状态感兴趣的对象。如果没有什么需要传递的信息,那么这种事件可以直接才采用微软提供的最简单的委托来声明这个事件——EventHandler.一般情况下微软的委托都是以Handler为后缀的,用来区分方法名所用,而且也可以生动的告诉使用者一个委托就是一个句柄一个指针并非一个实体。上面的代码中“public event TextChangedHandler TextChanged;”就是用我们自己定义的TextChangedHandler委托声明的事件。

那么这个事件怎么使用呢?我们声明了不去用那么也是白费。我们的目的是在Form1的Text属性被更改的时候,即时的通知某些关心这个属性的对象,因此我们就要在Form1的Text的属性的Set方法中写下一个
set
{
m_Text = value;
// 当前类的m_Text被修改的时候发布TextChanged事件。
OnTextChanged(m_Text);
}
当程序通过Text的Set方法为Text赋值之后,就会调用一个OnTextChanged()方法,并通过参数形式将改变之后的Text值传递给这个方法。而这个OnTextChanged方法就会检测当前对象的TextChanged事件是否有被注册的。if (TextChanged != null),这个判断就是判断是否有对象注册了这个事件。注:当有对象通过+=的形式注册了事件则事件TextChanged就不等于空了。上利中this.TextChanged += new TextChanged(Form1_TextChanged)已经注册了这个事件,因此在OnTextChanged方法中的判断是成立的,所以代码TextChanged(new TextChangedEventArgs(text));将会被调用。这里看起来好像很奇怪,怎么TextChanged事件变成了一个方法,别忘了我们是用TextChangedHandler这个代理声明的这个事件,因此这个事件的形式就会和TextChangedHandler的格式一样。

在这里TextChanged(new TextChangedEventArgs(text));做的事情类似于一个循环,他会找到所有已经注册这个事件的方法,也就是上例中
/// <summary>
/// 当发生了TextChanged事件之后的处理方法。
/// </summary>
/// <param name="e"></param>
void Form1_TextChanged(TextChangedEventArgs e)
{
MessageBox.Show(e.Text);
}
只要注册了这个事件并具有这种方法的对象,都将被调用。这也也就是为什么将委托叫回调函数的原因。这样每个关注Form1.Text属性的对象都可以有自己的处理方式,待发生了这个事件之后,有事件发布程序去调用这些已经定义好的操作。这样就充分达到低耦合度的目的。

至于上例中所定义public class TextChangedEventArgs:EventArgs
类,直接继承自系统的EventArgs类,作用于系统的EventArgs类一样都只是在事件发生的时候用来传递事件数据的用的。当然这只是微软内部关于事件数据的一种约定,我们在代理中也可以传递其他形式的类的对象,不过应尽量使用微软的这种形式来传递事件数据,这样也有利于改善程序的可读性。我们可以利用这种形式定义一些更加复杂的数据在事件发生时进行传递。这样就可以更加灵活的使用事件来进行对象之间的交流了。

2006-11-25 17:10
快速回复:委托怎么理解啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047513 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved