本论文是一篇关于函数方面毕业论文格式,关于代理其编程方法相关毕业论文提纲范文。免费优秀的关于函数及方法及指针方面论文范文资料,适合函数论文写作的大学硕士及本科毕业论文开题报告范文和学术职称论文参考文献下载。
摘 要:在C#语言中,可以用代理(Delegate)来动态地调用不同的函数.本文针对代理的基本概念、用代理编程的基本结构及多重代理进行讨论,并通过实例程序进行必要的说明.
关 键 词:函数指针;代理;多重代理
中图分类号:TP312文献标识码:A
1代理的基本概念
在C/C++中,函数调用有两种方式:一种是通过函数名直接调用;另一种是利用指向函数的指
关于函数方面论文范文素材
1.1函数指针
在C/C++中,函数名表示函数在存储区域的首地址,即是函数执行的入口地址.在程序中调用一个函数时,程序控制流程将转移到以该函数名为入口地址的地方执行该函数.
函数指针定义的一般形式是:
数据类型(*函数指针名)(参数表);
其中数据类型是函数指针所指向的函数所具有的返值类型,参数表是被调函数所具有的参数表.
一般来讲,函数指针得到某个函数名的赋值,程序将调用该函数;在函数指针作为函数的形参时,需要进行取内容的运算才能调用对应的函数.例如:
exe(intx,inty,int(*func)())
{return((*func)(x,y));}
在上述exe函数中,int(*func)()是函数指针,而“((*func)(x,y));”程序将转向由func所指向的函数去执行,其参数是x和y.
使用函数指针编程方法一般为:定义相应的函数;定义函数指针;通过某种操作使函数指针得到函数名的赋值;最后连同参数调用相应的函数.
1.2代理及其相关概念
在C#中,代理(delegate)的作用类似于C/C++中的函数指针.C#中的方法类似于C/C++中的函数,其方法名也是一个物理地址.方法的入口地址可以赋给“代理”,进而通过“代理”调用该方法;且同一个代理可以调用多个不同的方法.使用代理可以在程序的运行期间动态地调用所需的函数.
代理定义的一般格式为:
[访问控制修饰符]delegate返值类型代理名([形式参数表]);
其中:访问控制修饰符可以是new、public、protected、internal和private.new修饰符表明当前定义的代理将隐藏继承来的同名代理;public修饰符表明所有对象都可以访问该定义的代理;protected修饰符表明定义该代理的类及其子类可以访问该代理;internal修饰符只有代理所属的工程项目的成员可以访问该代理;private修饰符表明只有定义该代理的类才能访问该代理.
delegate是定义代理的关键字.代理名是符合C#的任意合法的标识符.返值类型是指该代理所调用方法的返值类型.形式参数表用于指出代理所调用方法的参数表.
例如,在一个类中定义一个代理MyDel_egate:
classMyClass
{等
publicdelegatevoidMyDelegate(strings);
等
}
在上述代理定义中的void表示该代理指向的方法不返回任何值,strings表示该代理所指向的方法将接受一个字符串参数.
在C#中,定义一个代理MyDelegate,C#编译器将根据代理的定义语句自动生成一个从System.MulticastDelegate类派生的子类MyDelegate.
2使用代理的编程结构
代理类似于C/C++的指向函数的指针,但是代理的使用范围比函数指针更加广泛.在C中,函数只有外部和静态函数两种,它们都属于静态函数的范畴;在C++中,函数指针只能引用静态方法,而代理不仅可以引用静态方法,还可以引用对象的实例方法.
2.1使用代理的编程结构
使用代理编程和在C/C++中使用函数指针类似,一般有:定义将要由代理调用的方法;声明一个代理;定义delegate处理的函数;创建实例并调用相应方法.
(1)定义拟调用的方法
该类方法的函数返值类型,函数形参的参数类型、个数及参数的顺序,决定了定义delegate类型代理时的相应参数.例如:
publicstaticstringFunctionA
(stringname){等}
publicstaticstringFunctionB
(stringname){等}
(2)声明一个代理
该代理的返值类型,参数的类型、个数及参数的顺序都必须与拟调用的方法的返值类型,形参类型、个数及参数的顺序完全相同.例如:
publicdelegatestringMyDelegate(stringname);
(3)定义delegate类型处理的函数
定义delegate类型处理的函数,并在此函数中通过delegate类型调用定义的方法.
publicstaticvoidMethodA(MyDelegateMe)
{Console.WriteLine(Me(“张三”));}
(4)创建实例并调用方法
由于声明一个delegate类型的代理在编译时将被转换成一个MulticastDelegate类的派生类,因此在使用代理时,必须要先创建该类的实例,并把它与一个方法关联.
MyDelegatea=newMyDelegate(FunctionA)
本语句的含义是:a引用指向方法FunctionA的程序代码段.
通过delegate处理函数调用相应的方法.MethodA(a);
2.2使用代理编程实例
usingSystem;
namespaceConDelegatejl
{publicclassTest
{//第一步:声明委托
publicstaticstringFunctionA(stringname)
{return“AsayHelloto”+name;}
publicstaticstringFunctionB(stringname)
{return“BsayHelloto”+name;}
//第二步:定义被调用的方法
publicdelegatestringMyDelegate(stringname);
//第三步:定义delegate类型处理函数
publicstaticvoidMethodA(MyDelegateMe)
{Console.WriteLine(Me(“张三”));}
publicstaticvoidMain()
{//第四步:创建实例,
//准备调用的方法名
MyDelegatea等于newMyDelegate(FunctionA);
MyDelegateb等于newMyDelegate(FunctionB);
MethodA(a);MethodA(b);Console.Read();
}
}
上述程序的运行结果如下图所示.
3多重代理及其实现
在C#语言中,每一个代理实例(对象)都含有一个调用链表,该链表可以包含多个该代理要调用的方法,此种机制用于一个代理实例可以调用多个方法,也就是多重代理(多播).多播要创建方法链表,当调用代理时,所有被链接的方法都会被自动地调用.
3.1Delegate类和MulticastDelegate类
所有的代理类都是由MulticastDelegate类派生的,而MulticastDelegate类又是由Delegate类派生的,它们都位于System命名空间下.
Delegate类有两个公用的只读属性:
Method属性:本属性用于获得代理实例要调用的静态方法.可以用如下代码获得代理对象所调用的方法名.
stringMethodName等于代理名.Method;
Target属性:该属性可以获得代理对象所在的类;如果代理调用的是静态方法,其返值为null,否则将返回代理实例所调用方法所在类名.如下代码可以获得代理调用方法所在类的名称.
stringObjType等于代理名.Target;
如果代理调用多个方法,则该属性将返回调用列表中最后一个实例方法所在的类名.
3.2MulticastDelegate类实现多重代理的机制
从MulticastDelegate类派生的用户
关于函数方面论文范文素材,与代理其编程方法相关毕业论文格式参考文献资料: