2018/8/4
今天家里就我一个,想去健身,天气太热作罢。 继续面试系列。。。
推荐书单:CLR via C#
1) .Net的优点有哪些?
1、良好的设计
2、面向对象的编程
3、支持多语言<c#,VB.NET,F#,Managed C++>,支持的语言都编译成中间语言(IL)
4、代码共享、高安全性
5、支持动态网页、支持Web 服务、GUI应用程序、组件库、数据库存储过程
6、跨平台 .NET Core
.NET framework 是 Microsoft提供的编程框架。开发者可以使用.Net Framework 开发应用,安装运行应用程序在不同的操作平台上。
程序在.Net 上编译时,代码会被转换为微软中间语言<MS-IL>,由JIT完成。代码在调用时得到编译,而不是在启动时编译整个代码,代码仅仅会被编译一次,且将一直存在直到应用程序退出。因此性能较好。
4) 什么是公共语言运行时(Common Language Runtime) ?
CLR是.Net Framework 运行时的环境。CLR的核心功能包括:内存管理、程序集加载、安全性、异常处理、线程同步等,可由面向CLR的所有语言使用。将微软中间语言转换为平台特定代码。跨平台,支持三大平台。
5) 什么是通用类型系统 (Common Type System ) ?
CTS用于描述类型的规范和行为,以便可以实现语言的互操作性。
1、CTS规范规定一个类型可以包含零个或者多个成员。 例如:字段Field、方法Method、属性Property、事件Event
2、指定类型的可见性规则及类成员的访问规则。例如:public、private、等。
3、定义类型继承、虚方法、对象生存周期等。
6) 什么是公共语言规范(Common Language Specification) ?
CLS范配合CTS实现语言的互操作性。CLS定义了一组标准,针对.NET的编译器都支持这些标准。例如:VB.Net 不区分大小写,C#区分大小写。
7) 什么是垃圾回收器(Garbage Collector) ?
GC用于内存管理。应用程序调用new操作符创建对象时,可能没有足够的空间分配该对象,发现空间不够或者内存中对象不在使用时,垃圾回收器清除内存中不在使用的对象。
号外:微软的COM(Component Object Mode)使用引用计数,堆上的每个对象都维护着一个计数字段,计数字段变为0时,对象就可以从内存中删除。GC的假设:对象越新,生存期越短,反之越长。回收堆的一部分,速度快于回收整个堆。
8) 如何调用垃圾回收?
使用“GC.Collect(); “
9) 什么是托管代码 (Managed Code) ?
托管代码就是由CLR运行和管理的代码。
程序集是一个或者多个类型定义文件及资源文件的集合。程序集定义了可重用的类型,有版本标记,可以关联安全信息。
11) 什么是程序集清单 (Assembly Manifest) ?
程序集清单是一个元数据的表集合,主要包括程序集的组成部分的文件名称,成绩的版本,语言文化,发布者等
12) 程序集有哪些类型 ?
共享程序集、私有程序集
13) 什么是命名空间(NameSpace) ?
NameSpace是一个逻辑分组,每一个类都有一个命名空间。
放在公用公认目录下供多个应用程序使用的程序集。CLR在检测到对该程序集的使用时必须知道检查该目录。这个公认目录就是GAC。
15) 如何添加和移除程序集到 GAC?
开发和测试时在GAC中安装程序集的常用工具是GACUtil.exe.
用法: Gacutil <命令> [<选项>]
1、添加 Gacutil -i A.DLL
2、移除 Gacutil -u A.DLL
号外:之前论坛中有人鄙视Windows程序员较多使用图形界面,没有命令行帅气。命令行没有多么高大上,工具而已。图形界面方便万千大众,当然做运维开发等命令行还是方便高效。
16) 什么是反射(Reflection)?
Reflection是动态加载一个类,创建对象并在运行时调用方法。可用于读取元数据,在运行时查查找程序集,模块,类型信息。
号外:高效的.NET ORM Dapper 使用到反射。
17) 什么是延时签名(Delay signing)?
Delay signing也称部分签名<partial signing>。延时签名允许只使用公钥生成程序集,暂不用私钥。
18) 什么是 Value types 和 Reference types ?
System exceptions由CLR抛出,application exceptions用户可以自定义。
20) 如何预防DLL被反编译(decompiled)?
源代码保护,可以使用加密的win32包装器。但不能绝对保证不被反编译。
21) 什么是本机代码生成器(Ngen.exe) ?
使用Ngen.exe 将IL代码编译成本机代码。由于代码在安装时已经编译好,所以CLR的JIT编译器不需要在运行时编译IL代码,有助于提升应用程序性能。
22) 什么是代码对象模型 (CodeDom) ?
Code Document Object Model 是代码生成器,可以减少人的代码工作量。一般企业开发中三层结构都会用到代码生成器。
号外:模型驱动开发(Model-driven development)是一个炙手可热的概念,使用UML或者类UML建模语言建模,然后根据一系列转换可生成平台无关的业务系统。目前看到的很多局部MDD,真正意义上的MDD目前还未出现或者我不知道。