C#面象对象学习:委托(delegate)
2007-03-23 11:46
302 查看
这些天来,我一直在看委托;
MSDN上看了看关于委托的文章,越看越糊涂了;
没有办法,只好用GOOGLE多搜几种解释委托的方法来看看,以及翻了翻写得比较详细的一些书籍。
力求搞懂这个委托,和学会使用委托
委托,到底什么呢?
很多书上和网络文章上都说:
C#中的委托,就相当于C/C++中的函数指针;但是C#是一种类型安全语言;在一般情况下不允许使用指针;
而委托的出现刚刚好弥补了这一缺陷,委托是类型安全操作;
如何使用委托呢?
委托的使用分为三步(也有说委托实际相当于一种特殊的类):委托声明,委托实例化,委托调用
下面我写一个简单的委托实例;也许这个实例不用委托实现也能完成,但我的目的只是为了明白如何使用委托而以
using System;
namespace Bino
...{
delegate int NumOpe(int a,int b); //委托声明
class Demo
...{
static void Main(string[] args)
...{
Demo d = new Demo();
NumOpe p1 = new NumOpe(d.Add); //委托实例化
Console.WriteLine(p1(1,2)); //委托调用
Console.ReadLine();
}
private int Add(int num1,int num2)
...{
return(num1+num2);
}
}
}
例中,委托NumOpe引用了方法Add。
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致:
1、参数个数、类型、顺序必须完全一致。
2、返回值必须一致
事件其实就是委托的一种;
有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。
在WinForm和WebForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click += new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。
还有今天在CSDN上也看到一个关于委托链的文章
class Demo
...{
private string name;
public Demo(string str)
...{
this.name = str;
}
public void Test()
...{
...//代码体略
}
}
Demo类有一个方法Test(),对他的实例来说A,B,C都有自己Test
Demo a,b,c;
a = new Demo("AAA");
b = new Demo("BBB");
c = new Demo("CCC");
假如这里通过定义委托来调用Test;
public delegate void Test()
如果想调用a.Test();
就可以通过
Test aTest = new Test(a.Test);
//同样b,c也要这样;
Test bTest = new Test(b.Test);
Test cTest = new Test(c.Test);
这个时候,如果想要a,b,c的Test共同执行的话,就要再定义一个复合委托;
Test AllToTest ;
//c#中通过“+“将方法Connect到委托,即将委托加到委托链中
//通过“-”将方法从委托链中删除
AllToTest = aTest+bTest+cTest;
看到+号应该不陌生,感觉在哪见过吧;
.net中的事件机制就是通过委托来实现的。
所以经常会看到这个+号;
MSDN上看了看关于委托的文章,越看越糊涂了;
没有办法,只好用GOOGLE多搜几种解释委托的方法来看看,以及翻了翻写得比较详细的一些书籍。
力求搞懂这个委托,和学会使用委托
委托,到底什么呢?
很多书上和网络文章上都说:
C#中的委托,就相当于C/C++中的函数指针;但是C#是一种类型安全语言;在一般情况下不允许使用指针;
而委托的出现刚刚好弥补了这一缺陷,委托是类型安全操作;
如何使用委托呢?
委托的使用分为三步(也有说委托实际相当于一种特殊的类):委托声明,委托实例化,委托调用
下面我写一个简单的委托实例;也许这个实例不用委托实现也能完成,但我的目的只是为了明白如何使用委托而以
using System;
namespace Bino
...{
delegate int NumOpe(int a,int b); //委托声明
class Demo
...{
static void Main(string[] args)
...{
Demo d = new Demo();
NumOpe p1 = new NumOpe(d.Add); //委托实例化
Console.WriteLine(p1(1,2)); //委托调用
Console.ReadLine();
}
private int Add(int num1,int num2)
...{
return(num1+num2);
}
}
}
例中,委托NumOpe引用了方法Add。
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致:
1、参数个数、类型、顺序必须完全一致。
2、返回值必须一致
事件其实就是委托的一种;
有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。
在WinForm和WebForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click += new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。
还有今天在CSDN上也看到一个关于委托链的文章
class Demo
...{
private string name;
public Demo(string str)
...{
this.name = str;
}
public void Test()
...{
...//代码体略
}
}
Demo类有一个方法Test(),对他的实例来说A,B,C都有自己Test
Demo a,b,c;
a = new Demo("AAA");
b = new Demo("BBB");
c = new Demo("CCC");
假如这里通过定义委托来调用Test;
public delegate void Test()
如果想调用a.Test();
就可以通过
Test aTest = new Test(a.Test);
//同样b,c也要这样;
Test bTest = new Test(b.Test);
Test cTest = new Test(c.Test);
这个时候,如果想要a,b,c的Test共同执行的话,就要再定义一个复合委托;
Test AllToTest ;
//c#中通过“+“将方法Connect到委托,即将委托加到委托链中
//通过“-”将方法从委托链中删除
AllToTest = aTest+bTest+cTest;
看到+号应该不陌生,感觉在哪见过吧;
.net中的事件机制就是通过委托来实现的。
所以经常会看到这个+号;
相关文章推荐
- C#学习笔记-delegate 委托
- C#学习基本概念之关键字---delegate(委托)
- C#学习--委托 Delegate
- C#学习日记19----引用类型 之 委托(Delegate) 类型
- C#学习重要概念之委托(delegate)
- 【C#学习】delegate(委托) 和 event(事件)
- Unity学习 - C#委托的介绍(delegate、Action、Func、predicate)
- Unity学习 - C#委托的介绍(delegate、Action、Func、predicate)
- C# 四种委托 Delegate Action Func Predicate 的学习
- C#中的关键字学习:delegate(委托)和volatile
- C#对象间的协作和信息交换(五)利用委托(Delegate)广播消息
- C#中的delegate委托类型基本学习教程
- C# 学习笔记_委托(一)Delegate
- C#学习笔记--委托(delegate)
- C#学习之委托(Delegate)
- 关于C# 委托(delegate)与事件(event)的用法及事例
- 关于C#.Net中事件(event)、委托(delegate)和方法的一点理解
- C#学习笔记(31)——委托窗体传值
- C#学习笔记(10)——再谈委托,不同国家问候的例子
- C# 委托(Delegate) 事件(Event)应用详解