码迷,mamicode.com
首页 > Web开发 > 详细

摘录-IT企业必读的200个.NET面试题-06 .NET中的高级特性

时间:2015-07-03 06:54:36      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

委托

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!