面试中的委托(共14页).doc
《面试中的委托(共14页).doc》由会员分享,可在线阅读,更多相关《面试中的委托(共14页).doc(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上面试中的委托 4.3 委托(1)委托技术是.NET框架中的高级特性之一,也可以说是.NET重要技术之一,是在大多数的技术笔试、面试中必定出现的部分。委托提供了安全的函数回调(CALL BACK)机制,成为程序员设计灵活简洁的.NET程序的重要方法之一。本章节将通过介绍委托概念和分析一些常见的委托技术题。面试题55 什么是委托.NET面试中经常会被提问什么是C#中的委托,面试官主要意图是考察应聘者对.NET的几个重要特性的了解。这样的细节问题往往让程序员不能够准确地回答,读者应该在平时学习的过程中注意积累。【出现频率】【关键考点】委托(Delegate)委托的特点【考题
2、分析】委托是一种引用类型,它是函数指针的托管版本。在C#中,委托是一种可以把引用存储为函数的类型。委托可以引用实例和静态方法,而函数指针只能引用静态方法。委托的声明非常类似函数,和函数不同的是委托不带函数体,并且需要使用Delegate关键字。委托的声明指定了一个函数签名,其中包含参数列表和一个返回类型。在定义了委托后,就可以声明该委托类型的变量,然后可以将这个变量初始化为与该委托有相同签名的函数进行引用,随后可以使用委托变量调用该函数。注意:委托虽然与函数指针非常类似,但却不是指针。许多程序员把.NET中的委托理解为安全的函数指针,这样的理解是比较牵强的,委托实现的功能和函数指针非常类似的一
3、点就是提供了程序回调机制。委托的内部实现机制和函数指针在指向方法这一点上是完全相同的。委托是安全的,主要因为委托和其他所有的.NET成员一样,均是一种类型,都是System.Delegate的某个派生类的一个对象。现在来分析一个具体的例子,示例代码如下:using System; namespace MyConsole class SimpleDelegate /定义一个返回为double类型的委托,这个委托有一个整型的输入参数 public delegate double Delegate_Prod(int a); static double fn_Prodvalues(int val1)
4、return val1 * val1; static void Main(string args) Delegate_Prod delObj = new Delegate_Prod(fn_Prodvalues); /声明一个委托 Console.Write(请输入数字); int v1 = Int32.Parse(Console.ReadLine(); /输入一个整型数值 double res = delObj(v1); /调用委托方法fn_Prodvalues Console.WriteLine(返回值: + res); /返回结果 Console.ReadLine(); 示例代码中,首先通
5、过public delegate double Delegate_Prod(int a)定义了一种名为Delegate_Prod的新类型,这个类型继承自System.MulticastDelegate。它包含一个名为Invoke()的方法,该方法接收一个字符型的参数且没有任何返回。这些步骤都是由C#编译器自动完成的。然后,声明了一个Delegate_Prod的对象delObj,并且绑定到fn_Prodvalues这个静态方法上。运行结果如下:请输入数字9 返回值: 81 注意:本质上,委托的调用就是执行了在定义委托时所生成的Invoke()方法。C#中的委托类都继承自System.Delega
6、te类型。委托类型的声明与方法签名相似,有一个返回值和任意数目任意类型的参数。委托是一种可用于封装命名或匿名方法的引用类型。委托类似于函数指针,但是委托是类型安全和可靠的。面试题56 C#中被委托的方法必须是静态的吗关于委托的方法是否必须是静态方法这个考题,考察点非常明确。面试官一般希望了解应聘者是不是仅仅了解如何定义和简单的使用委托,是否真正掌握理解委托的内部原理。【出现频率】【关键考点】静态方法与实例方法的区别分析委托的方法是否必须是静态方法【考题分析】在分析这个问题之前,先了解C#几个基本的概念。在C#中最常见的方法就是静态方法和实例方法,它们之间的区别如表4.1所示。表4.1 静态方法
7、和实例方法的区别静 态 方 法实 例 方 法Static关键字不需要static关键字类名调用实例对象调用可以访问静态成员可以直接访问静态成员不可以直接访问实例成员,需要实例化可以直接访问静态成员不能直接调用实例方法,需要实例化可以直接调用实例方法和静态方法调用前初始化实例化时初始化 如表4.1所示,在C#中静态方法由关键字static来定义。静态方法不需要实例化该对象,即可以通过类名来访问对象。相应地,在静态方法中不能直接访问类型中任何非静态成员。而实例方法,则需要通过具体的实例对象来调用,并且可以访问实例对象中的任何成员对象。委托绑定实例方法的分析,依据C#实例方法的定义,当一个实例方法被
8、调用时,需要通过实例对象来访问,因此绑定实例方法到委托时,必须同时让委托得到该实例方法的实例对象的信息。这样,.NET才能在委托被回调(CallBack)的时候成功地执行该实例方法。Delegate.Target属性是一个指向目标实例的引用,当绑定实例方法给委托时,该参数会被设置为该方法所在类型的一个实例对象。委托绑定静态方法的分析。Delegate.Target属性是一个指向目标实例的引用,当绑定一个静态方法给委托时,则该参数会被设置为null。注意:如果委托调用一个或多个实例方法,则此属性返回调用列表中最后一个实例方法的目标。【答案】通过上面的分析读者可以清晰地判别,委托不仅能绑定静态方法
9、,同时也可绑定实例方法。当绑定实例方法时,Delegate.Target属性将会设置成指向该实例方法所属类型的一个实例对象,当绑定静态方法时,Delegate.Target属性将会被设置成null。 4.3 委托(2)面试题57 什么是多播委托每个委托都只包含一个方法调用,调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要多次显式调用这个委托。当然委托也可以包含多个方法,这种委托称为多播委托。下面将详细分析这个问题。【出现频率】【关键考点】多播委托的基本概念System.MulticastDelegate 的特性【考题分析】在本章前文中,笔者已经详细地介绍了委托的基本概念。而所谓的
10、多播委托,是指引用多个方法的委托,当调用委托时,它连续调用每个方法。在调用过程中,委托必须为同类型,返回类型也必须是void,且不能带输出参数(但可以带引用参数),这样才能将委托的单个实例合并为一个多播委托。除此之外,多番委托的声明和实例化方法都和其他委托没有什么不同。现在来看一个实际的例子,示例代码如下:using System; namespace MyConsole class MulticastDelegate /定义委托,接收一个字符型参数 public delegate void hellokittyHander(string msg); private void hellokit
11、ty1(string msg) /定义一个简单的私有方法hellokitty1() Console.WriteLine(hello kitty1 + msg); private void hellokitty2(string msg) /定义一个简单的私有方法hellokitty2() Console.WriteLine(hello kitty2 + msg); private void hellokitty3(string msg) /定义一个简单的私有方法hellokitty3() Console.WriteLine(hello kitty3 + msg); static void Mai
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面试 中的 委托 14
限制150内