当前位置:编程学习 > C#/ASP.NET >>

c# 委托是怎么回事?怎么用?

谁能解说下c#里面委托到底是怎么一回事?
能不能举个例子详细关系说下?
比如:menuform.load+=new ......
答案:
委托 delegate是只有一个函数的特殊的类
委托对象的引用相当函数指针
delegate 声明定义一种引用类型,该类型可用于将方法用特定的签名封装。委托实例封装静态方法或实例方法。委托大致类似于 C 中的函数指针;但是,委托是类型安全和可靠的。
委托使您得以将函数作为参数传递。委托的类型安全要求作为委托传递的函数拥有同委托声明相同的签名
使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给某个方法,而不必在编译时知道将调用哪个方法。与 C 或 C 中的函数指针不同,委托是面向对象、类型安全的
委托声明定义一种类型,它用一组特定的参数以及返回类型封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果您有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。
委托的一个有趣且有用的属性是,它不知道或不关心自己引用的对象的类。任何对象都可以;只是方法的参数类型和返回类型必须与委托的参数类型和返回类型相匹配。这使得委托完全适合“匿名”调用
class Program
{
delegate bool CompareOp(int v1, int v2);
static void Main(string[] args)
{
CompareOp less = new CompareOp(Program.Less);
Console.WriteLine(less(1, 2).ToString());
Console.WriteLine("Test Delegate");
Console.ReadLine();
}
static public bool Less(int a, int b)
{
return a < b;
}
}
//2
delegate void MyDelegate(int i);
class Program
{
public static void Main()
{
TakesADelegate(new MyDelegate(DelegateFunction));
}
public static void TakesADelegate(MyDelegate SomeFunction)
{
SomeFunction(21);
}
public static void DelegateFunction(int i)
{
System.Console.WriteLine("Called by delegate with number: {0}.", i);
}
}
让我来告诉你吧
委托是什么?委托是函数指针。函数指针是什么?是能够运行某(几)个函数(方法)的代码。

举个例子
void static main(){

do();
}
void static do(){

int a = 0;
}

这个好理解吧。。。在main函数内调用do函数。
能够这样写,是因为do的代码(int a = 0;)是已知的。但是,假如在main函数内要调用do函数,却不知道do函数的内容是怎样的,该怎么办呢?

void static main(Adelegate do){

do();
}
do就是一个委托。我们不知道do是怎样写的,我们只知道do函数的参数为空。这就是所谓函数指针--仅在运行时才知道函数的代码。


补充-----------------------------------
比如说windows消息循环就是这种模式。
举个例子。
假如你是微软,你写了一个button控件,他的功能是:当鼠标点击时做点什么。代码可能像这样
while(true){

do();//做点什么
}
问题是:微软怎么知道你要做点什么呢?1000个程序员可以给出1000个答案。
程序员a想显示一条信息,程序员b想打开一个网站。。。
因此,微软不可能自己实现do方法,把它交给人家去做吧!
于是代码改为
public ClickedEventHandler OnClick();//ClickedEventHandler是一个委托
while(true){

if (OnClick != null)

OnClick();
}

程序员a就能这样写代码了:
Button b = new Button();
b.OnClick += new ClickedEventHandler(do());
.................

privte void do(){

MessageBox.Show("haha");
}
点击按钮时,就可以看到'haha'字样了。

当然,不是所有委托都要表示成事件,但事件确是最典型的委托。你问题中的代码是事件,其实,事件也是一种委托。说白了,委托是一种特殊的数据类型,当委托变量被调用时,与委托绑定的N个方法会被执行(只要方法签名与委托相同)。我举个例子。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
delegate void MyDeleate();
class Program
{
static void Main(string[] args)
{
// 初始化委托变量
MyDeleate dlg = new MyDeleate(WorkA);
// 多绑定一个方法
dlg += WorkB;
// 调用委托
dlg();
Console.ReadKey();
}
static void WorkA()
{
Console.WriteLine("Hello,我是A。");
}
static void WorkB()
{
Console.WriteLine("Hello,我是B。");
}
}
}

输出的结果是,两个方法被同时调用。

 

上一个:C#从数据库取数据放到下拉列表里?
下一个:C#姹傝繖鏉$▼搴忛鐨勫畬鏁翠唬鐮?- 宸茶В鍐?- 鎼滄悳闂棶

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,