标签:
Q: 请解释委托的基本原理
委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,委托实现了回调方法的机制。
Q: 委托回调静态方法和实例方法的区别
当委托绑定静态方法时,内部的对象成员变量_target将会被设置为null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。
Q: 什么是链式委托
链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。
Q: 链式委托的执行顺序是怎样的
链式委托的执行顺序是:按照委托链上的顺序从当前委托开始依次往后执行。如果有需要,可以通过GetInvocationList()方法来获得委托链上所需要执行的委托,并按照希望的顺序去执行它们。
Q: 可否定义拥有返回值的方法的委托链
委托可以是带有返回值的方法,但多于一个带返回值的方法被添加到委托链中时,程序员需要手动调用委托链上的每个方法,否则委托使用者只能得到委托链上最后一个被执行方法的返回值。
Q: 委托通常可以应用在哪些场合
委托的应用场合通常是任务的执行者把细节工作进行再分配,执行者确切地知道什么工作将要被执行,但却把执行细节委托给其他组件、方法或者程序集。
Q: 请解释事件的基本使用方法
事件是一种使对象或类能够提供通知的成员。客户端可以通过提供事件处理程序为相应的事件添加可执行代码。事件是一种特殊的委托。
Q: 事件和委托有何联系
事件是一个委托类型,该委托类型的方法无返回值,并且拥有两个参数:object和TEventArg。事件的订阅和取消都是基于委托链表来实现的。
Q: 如何设计一个带有很多事件的类型
当某个类型包含较多的事件时,可以考虑集中把所有事件的委托链表存储在一个集合中,这样能有效减少对象的大小,因为在实际中一个对象使用所有事件的情况很少。.NET的内建类型System.ComponentModel.EventHandlerList提供了这样一个存储事件集合的封装。
Q: 用代码表示如下情景:猫叫、老鼠逃跑、主人惊醒
下面给出一个简单的例子:
猫的定义:
public class Cat { private string _name; public event EventHandler<CatCryEventArgs> CatCryEvent; public Cat(string name) { _name = name; } public void CatCry() { CatCryEventArgs args = new CatCryEventArgs(_name); Console.WriteLine(args); CatCryEvent(this, args); } }
事件参数定义:
public class CatCryEventArgs : EventArgs { private string _catName; public CatCryEventArgs(string catName) : base() { _catName = catName; } public override string ToString() { return _catName + "叫了"; } }
老鼠的定义:
public class Mouse { private string _name; public Mouse(string name, Cat cat) { _name = name; cat.CatCryEvent += cat_CatCryEvent; } void cat_CatCryEvent(object sender, CatCryEventArgs e) { Run(); } private void Run() { Console.WriteLine("老鼠" + _name + "逃跑了"); } }
主人的定义:
public class Master { private string _masterName; public Master(string name, Cat cat) { _masterName = name; cat.CatCryEvent += cat_CatCryEvent; } void cat_CatCryEvent(object sender, CatCryEventArgs e) { WakeUp(); } private void WakeUp() { Console.WriteLine("主人" + _masterName + "醒了"); } }
代码运行:
Console.WriteLine("开始模拟"); Cat cat = new Cat("汤姆猫"); Mouse m1 = new Mouse("老鼠1号", cat); Mouse m2 = new Mouse("老鼠2号", cat); Master master = new Master("Jack", cat); cat.CatCry(); Console.ReadLine();
Q: 请解释反射的基本原理和其实现的基石
反射是一种动态分析程序集、模块、类型、字段等目标对象的机制,它的实现依托于元数据。元数据是存储在PE文件中的数据块,它详细记录了程序集或模块内部的结构、引用类型、程序集和清单。
Q: .NET提供了哪些类型来实现反射
在System.Reflection命名空间下,.NET提供了丰富的实现反射机制的类型。
Q: 如何实现动态地发射程序集
在System.Reflection.Emit命名空间下,定义了一系列用于动态发射中间代码的类型,这些类型可以用来实现动态创建程序集的功能。生成的中间代码被直接写入内存中,而不是以代码的形式驻留在硬盘中。
Q: 如何利用反射来实现工厂模式
使用反射可以实现灵活性较高的工厂模式,其关键在于动态查找产品所包含的所有零件,而不是需要通过代码来逐一分析使用者的需求。反射工厂模式具有灵活性较高、运行效率较低的特点。
Q: 如何以较小的内存代价保存Type、Field和Method信息
System.RuntimeTypeHandle、System.RuntimeMethodHandle和System.RuntimeFieldHandle三个类型分别包含了一个指向类型、方法和字段描述的指针,用保存指针的方式来代替保存整个类型、方法和字段的信息描述对象,可以有效减少内存的消耗。
Q: 什么是特性,如何自定义一个特性
特性是一种特殊的用以声明式编程的机制,特性类型是一族继承自System.Attribute的类型,在编译时,特性的使用会被写入元数据中,以供运行或者程序中的反射使用。
Q: .NET中特性可以在哪些元素上使用
通过AttributeUsage特性可以限制自定义特性的适用范围
Q: 有哪几种方法可以获知一个元素是否申明某个特性
摘录-IT企业必读的200个.NET面试题-06 .NET中的高级特性
标签:
原文地址:http://www.cnblogs.com/laixiancai/p/4615041.html