你的位置:首页 > 软件开发 > ASP.net > .NET面试题系列[6]

.NET面试题系列[6]

发布时间:2016-08-02 19:00:05
在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等)。如果答得好,还可能会问一下如何优化反射(Emit法,委托法)。反射的性能远远低于直接调用,但对于必须要使用的场景,它的性能并非不 ...

在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等)。如果答得好,还可能会问一下如何优化反射(Emit法,委托法)。

反射的性能远远低于直接调用,但对于必须要使用的场景,它的性能并非不可接受。对于“反射肯定是造成性能差的主要原因”这种说法,要冷静客观的分析。

.NET平台可以使用元数据完整的描述类型(类,结构,委托,枚举,接口)。许多.NET技术,例如WCF或序列化都需要在运行时发现类型格式。.NET中,查看和操作元数据的动作称为反射(也称为元编程)。

 

.NET面试题系列[6]

 

反射就是和程序集打交道。上图显示了程序集的阶层关系。通过反射我们可以:

  1. 获得一个程序集:这称为动态加载程序集,或者晚期绑定。相对的,早期绑定就是引用程序集,从而在运行时之前就加载它。获得程序集之后,就可以进一步获得其中的类型,然后再进一步获得类型中的方法,属性的值等等。
  2. 获得程序集的托管模块。一个程序集可以包含多个托管模块。通常我们对程序集和类型的名字很熟悉,对模块则一无所知,所以这通常没什么用,因为我们获得模块的最终目的还是为了模块中的类型。
  3. 获得程序集中(托管模块中的)的类型。此时System.Type类起着十分关键的作用。它可以返回类型对象,之后,我们就可以获得类型的成员和方法表。获得类型对象之后,我们就可以进一步获得类型的成员。
  4. 获得类型的成员。常见的情境有遍历所有属性并打印其值,反射调用方法等。ORM通过反射获得类型及其成员,然后为其赋值。

使用反射时,一个重要的类型是System.Type类,其会返回加载堆上的类型对象(包括静态成员和方法表)。当我们要反射一个类的方法时,首先要获得它的类型对象,然后再使用GetMethods方法获得某个方法。获得方法之后,可以使用Invoke执行方法。

反射带来了非常强大的元编程能力,例如动态生成代码。如Ruby的元编程能力,它的ORM可以从数据库的Schema中直接“挖出”字段,而类本身几乎无需定义任何内容,这就是元编程的威力表现之一。

反射有什么应用场景?


 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:.NET面试题系列[6]

关键词:.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。