《C#高级编程》之委托学习笔记 (转载)
最近在学C#的委托,通过网络的资料和书籍,现在总结如下:
回调(Callback)函数是windows编程的一个重要部分。回调函数实际上是方法调用的指针,也成为函数指针,是一个非常强大的编程特
回调(Callback)函数是windows编程的一个重要部分。回调函数实际上是方法调用的指针,也成为函数指针,是一个非常强大的编程特性。.NET以委托的形式实现了函数的指针的概念。与C/C++的函数指针不同的是.NET委托是类型安全的。也就是说C/C++的函数指针只不过是一个指向内存单元的指针,我们无法知道这个指针实际指向什么,像参数和返回类型等就无从知晓了。
当把方法传送给其他方法时,需要用到委托。如考虑以下的函数:
C++:
#include <iostream>
#include <string>
using namespace std;
int fun(int);
int fun_call(int (*f)(int),int);
void main(int argc,char* argv[])
{
typedef int (*fp)(int);
fp fpt;
fpt=fun;
count<<fun_call(fpt,1);
}
int fun(int a)
{
return a-1;
}
int fun_call(int (*fp)(int),int b)
{
return (fp(10)+b);
}
上述程序的“ftp=fun”实现函数指针的初始化,直接将fun的地址赋给函数指针ftp,然后传送给fun_call,fun_call可以根据这两个参数计算出结果:fp(10)=9,9+1=10。实现了把方法传送给其他方法。
函数指针最常用的是使用函数指针数组来批量调用函数:
int f1(){return 1;}
int f2(){return 2;}
int f3(){return 3;}
void main(int argc,char* argv[])
{
tpyedef int (* fp)();
fp fps[3]={f1,f2,f3};
for(int 0;i<2;i++)
{
cout<<fps[i]<<endl; //实现按数组序列号调用函数
}
}
在编译时我们不知道第二个方法会是什么,这个信息只能在运行时得到,所以需要把第二个方法作为参数传递给第一个方法。在C/C++,只能提取函数的地址,并传送为一个参数。c是没有类型安全性的,可以把任何函数传送给需要函数指针的方法。这种直接的方法会导致一些问题,例如类型安全性,在面向对象编程中,方法很少是孤立存在的,在调用前通常需要与类实例相关联。而这种指针的方法没考虑这种情况。所以.NET在语法上不允许使用这种直接的方法。如果要传递方法,就必须把方法的细节封装在一种新的类型的对象中,这种新的对象就是委托。
委托,实际上只是一种特殊的对象类型,,其特别之处在于,我们之前定义的所有对象都包含数据,而委托包含的只是函数的地址。
1、在c#中声明委托
delegate void Method(int x);
定义了委托就意味着告诉编译器这种类型的委托代表了哪种类型的方法,然后创建该委托的一个或多个实例。编译器在后台将创建表示该委托的一个类。也就是说,定义一个委托基本上是定义一个新类,所以可以在定义类的任何地方定义委托,既可以在类的内部定义,也可以在类的外部定义。注意,委托是类型安全性非常高的,因此定义委托时,必须给出它所代表的方法签名和返回类型等全部细节。
2、在C#中使用委托
using System;
namespace DelegateSpace
{
class DelegateTest
{
private delegate string GetString(int x,int y);
static void Main()
{
Test test=new Test();
GetString method=new GetString(test.Add);
Console.WriteLine(method());
}
}
class Test
{
public string Add(int x,int y)
{
return (x+y).ToString();
}
}
}
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69433.html