C#之委托概念认识学习笔记
2010-01-27 19:09
232 查看
回调函数是一项非常有用的编程机制,它在程序设计界的应用已有很多年了。Microsoft。NET框架使用一种称作委托(delegate)的技术来提供回调函数机制。与其他平台中使用的回调机制不同,委托为我们提供了更多的功能。例如,委托可以确保回调方法是类型安全的(这是通用语言运行时最重要的目标之一)。委托还集成了按序调用方法的能力,并且同时支持调用静态方法和实例方法。
认识委托
C语言运行时中的qsort就是利用回调函数来对一个数组中的元素进行排序的。在windows中,窗口过程、钩子过程、异步过程调用等都要求使用回调函数。在.NET框架中,回调方法也用于很多场合。例如,我们可以通过登记回调方法来获得各种各样的通知,如未处理的异常、窗口状态的改变、菜单项目的选中、文件系统的变更以及异步操作的完成等。
在非托管C/C++中,函数的地址就是一个内存地址。该地址不会携带任何额外的信息,例如函数期望的参数个数、参数类型、函数的返回值类型以及函数的调用约定。一言以避之,非托管C/C++中的回调函数时非类型安全的。
在.NET框架中,回调函数仍然像在非托管windows编程中一样有用和普遍。但是,.NET框架为回调函数提供了一种称为委托(delegate)的类型安全的机制。在详细讨论委托之前,首先向大家展示一下他们的使用方法。下面的代码演示了怎样声明、创建和使用委托。
using System;
using System.Windows.Forms;
using System.IO;
class Set{
private Object[] items;
public Set(Int32 numItems){
items=new Object[numItems];
for(Int32 i=0;i<numItems;i++){
items[i]=i;
}
//定义一个Feedback委托类型
//注意:该类型嵌套在Set类中
public delegate void Feedback(Object value,Int32 item,Int32 numItems);
public void ProcessItems(Feedback feedback){
for(Int32 item=0;item<items.Length;item++){
if(feedback!=null){
//如果指定有回调函数,则调用它们
feedback(items[item],item+1,items.Length);
}
}
}
}
class App{
static void main(){
StaticCallbacks();
InstanceCallbacks();
}
...
}
未完待续
认识委托
C语言运行时中的qsort就是利用回调函数来对一个数组中的元素进行排序的。在windows中,窗口过程、钩子过程、异步过程调用等都要求使用回调函数。在.NET框架中,回调方法也用于很多场合。例如,我们可以通过登记回调方法来获得各种各样的通知,如未处理的异常、窗口状态的改变、菜单项目的选中、文件系统的变更以及异步操作的完成等。
在非托管C/C++中,函数的地址就是一个内存地址。该地址不会携带任何额外的信息,例如函数期望的参数个数、参数类型、函数的返回值类型以及函数的调用约定。一言以避之,非托管C/C++中的回调函数时非类型安全的。
在.NET框架中,回调函数仍然像在非托管windows编程中一样有用和普遍。但是,.NET框架为回调函数提供了一种称为委托(delegate)的类型安全的机制。在详细讨论委托之前,首先向大家展示一下他们的使用方法。下面的代码演示了怎样声明、创建和使用委托。
using System;
using System.Windows.Forms;
using System.IO;
class Set{
private Object[] items;
public Set(Int32 numItems){
items=new Object[numItems];
for(Int32 i=0;i<numItems;i++){
items[i]=i;
}
//定义一个Feedback委托类型
//注意:该类型嵌套在Set类中
public delegate void Feedback(Object value,Int32 item,Int32 numItems);
public void ProcessItems(Feedback feedback){
for(Int32 item=0;item<items.Length;item++){
if(feedback!=null){
//如果指定有回调函数,则调用它们
feedback(items[item],item+1,items.Length);
}
}
}
}
class App{
static void main(){
StaticCallbacks();
InstanceCallbacks();
}
...
}
未完待续
相关文章推荐
- C#学习笔记8——C# 中的委托和事件
- C#学习基本概念之关键字---delegate(委托)
- C#学习笔记:泛型委托Action<T>和Fun<TResult>
- C#学习笔记17-Action委托和Func委托
- 新手菜鸟学习C#的笔记总结 之委托
- C#学习笔记-委托
- C#学习笔记之一:委托
- C#教程第7讲委托1(学习笔记)
- c#学习笔记五 面向对象编程的基本概念 接口 继承和多态
- 学习笔记:c#函数名可以直接赋值给委托
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同
- C#学习笔记-委托
- c#网络编程学习笔记00_补上一些基础概念
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同.
- c#学习笔记(六)委托
- C#学习笔记 委托
- C#学习笔记(31)——委托窗体传值
- c#学习笔记四 委托
- C#及.NET2.0学习笔记之C#语言基本概念
- C#学习笔记--委托(delegate)