1. Thread和Process之间有什么区别?.NET新引入了Application Domain的概念,这样他们三个之间有什么区别?引入了Application Domain会带来一些潜在的问题么?
Thread是线程,Process是进程,一个进程中可以有多个线程。
Process是进程,是系统级别的隔离。Thread是线程,属于进程里面再进行的隔离,一般隔离程度不是很大,主要用于区分不同的任务进行执行。
而.Net的Application Domain属于Process和Thread之间的一层隔离,相当于把一个进程区分成多个AppDomain,然后不同的线程在不同的AppDomain中执行。
进程>应用程序域>线程
2.Windows Service与普通的EXE在执行过程中有什么区别?
1)启动时间不同。windows service 是系统服务,在用户登录时已启动,需要24小时运行监听其他程序。而普通的EXE是在用户登录后启动。
2)启动域不同。服务是一个work station,切换不同帐户后该服务还是在运行中的。而普通EXE是由用户启动的只在该用户下运行。
3)windows service可以被系统设置为无法关闭,而普通exe可以从任务管理器关闭。
4)如果windows service由于自身异常而推出后可以自动重启,而exe只能由用户重启或者编写其他程序控制其重新启动。
3.一个进程可以访问的Windows地址空间有多大?等于系统的虚拟内存大小么?这两方面将对系统的设计产生什么样的影响?
1)一个进程可以访问的Windows地址空间理论上是2的机器位数方(32位就是2^32,但实际要去除操作系统占用区域)
2)不等于虚拟内存大小。虚拟内存可以远大于进程地址空间大小。
3)因为多个虚拟内存页可以调度到一个实际内存页中。影响就是需要对内存进行页式调度管理,需要内存页提高命中率等。
4.EXE和DLL之间的区别是什么?在系统设计中应该如何选择使用它们?
exe是可以直接执行的程序。
dll是动态链接库,在被其他程序调用后才可以运行。它们是在运行时由磁盘物理映像载入被调用者的内存空间或共享内存空间执行。
5.普通的EXE与.NET EXE的执行过程有什么不同?
普通的exe可以直接在机器上运行。
.net exe 需要编译之后在CLR(Common Language Runtime 公共语言运行时)下才可以运行。
6.什么是弱类型,什么是强类型?在系统设计中应该首先考虑使用哪种类型?
弱类型是由它所存储的值来决定变量的类型,强类型是用之前需要先声明类型。应该首先考虑强类型
7.PDB文件是作什么用的?里面包含了什么信息?
程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。
8.Cycloramic Complexity是什么?为什么它很重要?
圈复杂度,衡量代码逻辑的复杂程度
9.为创建一个critical section以访问某个变量书写一个标准的lock() 并加上double check。
If(m_Instance!=null)
{
lock(this)
{
if(m_Instance!=null))
{
//do something
}
}
}
10.为某个对象实现标准的Dispose模式。
class MyDispose:IDisposable
{
public void Dispose()
{
}
}
11.什么是FullTrust? 存在于GAC中的 assembly 拥有FullTrust么?
12.下面这个命令是做什么的?gacutil /l | find /i “system”
gacuti 是全局程序集缓存工具
gacutil /l 是列出全局程序集缓存的内容
具体用法 :https://msdn.microsoft.com/zh-cn/library/ex0ss12c
13.下面这个命令是作什么的? sn -t something.dll
Sn.exe 提供用于密钥管理、签名生成和签名验证的选项。 产生强类型程序集的密钥对.
14.跨防火墙的 DCOM必须打开哪个端口?端口135是用来做什么的?
DCOM 使用 RPC 动态端口分配方式,该方式随机选择 1024 以上的端口号
135是远程过程调用端口
15.有什么办法可以与现有unmanaged code集成?在集成的时候应该考虑什么问题?
加一个unsafe标签就可以,考虑的问题主要是垃圾回收和资源释放.
16.简要解释一下OOP与SOA都是用来作什么的?
OOP是面向对象的编程架构。SOA是面向服务的架构。
17.XmlSerializer是如何工作的?进程运行XmlSerializer时候需要什么样的ACL权限?
1)利用反射机制和元数据进行工作。
2)需要能访问数据集元数据的权限。如果是反序列化,同时还需要实例化类型的权限。
18.在系统设计时,何时应该使用try catch?何时需要避免使用?
如果在执行某段代码时可能会出异常就需要使用try catch捕捉并抛出异常。
为了提高性能,在检查数据的合法性时应避免使用异常捕捉。
19.Debug.Write()和Trace.Write()之间有什么区别?二者分别应该用于何处?
Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,
Trace是在debug和release两种模式下均可以向跟踪窗口输出信息。
20.Debug Build和Release Build有什么区别?在执行效率上有什么明显的区别么?
Debug Build 包含调试信息,效率比Release Build要低。
21.JIT是针对Assembly还是Method发生的?解释一下为什么.NET的设计者要这样做?
JIT(即时编译器)是针对方法发生的。
22.简要描述一下GC的执行过程。
当内存减少到一定程度时,CLR调用GC回收不被引用的对象,释放其占用的内存。
23.应该如何选择使用abstract class还是interface?
抽象类可以定义抽象方法而不实现,由它的子类实现抽象方法;也可以定义一般方法并实现。抽象类可以定义属性和字段。
接口只能定义方法不能实现方法,接口可以当作是为实现接口的方法提供一种规范和约束。
24.在设计一个自定义类型时应如何选择使用Value Type还是Reference Type?
小数据量用值类型,大数据量用引用类型。
需要动态增加的用引用类型。
25.对于Value Type和Reference Type,a.Equals(b)的默认实现方式有什么不同?
对于值类型,a.Equals(b)就是比较a和b的值,如果相同就返回true
对于引用类型,a.Equals(b)比较的是这两个变量所指向的对象。如果指向的是对象就返回true
但是对于string类型来说,a.Equals(b) 和a==b的结果都是比较a和b的值。
26..NET中为什么不提供默认的deep copy?如果需要,要如何实现deep copy?
27.相对于.NET 1.1,.NET2.0为了避免过度的boxing/unboxing造成的系统开销提供了哪些支持?
28.String是Value Type还是Reference Type?为什么.NET中的String对象被设置成immutable?
String 是引用类型。因为字符串在系统中出现的频率很高,所以将它设置为不可变的,目的是让同一个字符串指向同一内存空间,从而减少系统开销