任何一个使用.NET的人
描述线程与进程的区别与联系:
相同点:
(a)二者都具有ID,一组寄存器,状态,优先级以及所要遵循的调度策略。
(b) 每个进程都有一个进程控制块,线程也拥有一个线程控制块。
(c)线程和子进程共享父进程中的资源;线程和子进程独立于它们的父进程,竞争使用处理器资源;线程和子进程的创建者可以在线程和子进程上实行某些控制,比如,创建者可以取消、挂起、继续和修改线程和子进程的优先级;线程和子进程可以改变其属性并创建新的资源。
不同点:
线程(Thread)与进程(Process)二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。一个进程可以包括若干个线程,一个程序至少有一个进程,一个进程至少有一个线程
进程:资源分配和调度的一个独立单位
线程:CPU调度和分派的基本单位
什么是Windows服务,它的生命周期与标准的EXE程序有什么不同 Windows Service 是一种可随 Windows 操作系统启动而启动的,在后台运行的,通常不和用户产生交互的程序,没有标准的UI界面,想比标准的EXE程序,Windows服务是在服务开始的时候创建,而在服务结束的时候销毁,而且可以设置服务是否与操作系统一起启动,一起关闭。它支持三种方式:1)自动方式 2)手动方式 3)禁用。自动方式的时候,windows服务将在OS启动后自动启动运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被启动。另外标准的EXE默认使用的当前登录的用户,而windows服务则默认使用System用户Windows服务并不需要通过登陆页面后才能启动,而我们启动一般的exe文件却要先登陆Windows后才能启动它
Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么影响?
32 位Windows上单个进程所能访问的最大内存量是4G,单由于操作系统需要给系统核心分配2G的空间,所以一般用户程序的进程可使用的最大内存为2G。
不一定一样,32位的操作系统的进程可访问的最大内存量是4G,这4G包含了虚拟内存,而一个进程可访问的最大内存量也是4G,所以进程内存访问量在物理内存大于等于4G的时候跟虚拟内存无关,而当物理内存小于4G时,进程访问的内存量随着虚拟内存的增加而增加,直到4G
EXE和DLL之间的区别是什么?
EXE是可以单独运行的程序, 有自己的进程空间,含有程序的执行入口,比如说Main()函数。 DLL一般是封装了一些共享的例程和资源,它通常是一个可以被其它应用程序调用的程序模块不能单独运行,一般是由EXE程序来调用DLL的函数
什么是强类型,什么是弱类型?哪种更好些?为什么?
强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。没有好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语言,如c++,java,c#,pascal等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb等
PID是什么?在做系统的故障排除时如何使用它?
PID是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visual studio.net等ide将故障进程附加到进程中进行调试(debug)
单个TCP/IP端口上能够侦听多少个进程?
1个
什么是GAC?它解决了什么问题?
Gloal Assembly Cache,全局应用程序集缓存。它解决了几个程序共享某一个程序集的问题。不必再将那个被共享的程序集拷贝到应用程序目录了
中级.NET开发人员
阐述面向接口、面向对象、面向方面编程的区别
面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现,严格的来说,面向接口应该是面向对象中的一部分吧,因为面向对象也强调的是本末倒置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现,更具比较的应该是面向接口与面向抽象对象,我的体会是面向接口更加灵活,但实现时候,稍微有些代码冗余,而面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共逻辑,再实现具体实现类。面向对象是对复杂问题的分解。面向方面的编程是一种新概念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码模块化,而无法对和业务无关的代码模块化。而面向方面正是解决这一问题的方案,它的关键思想是"将应用程序中的商业逻辑与对其提供支持的通用服务进行分离"。
什么是Interface?它与Abstract Class有什么区别?
接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类
什么是Interface?它和Class有什么区别?
1>接口不能实例化;
2>接口中的方法没有方法体{};
3>继承接口的类一定要实现接口中定义的方法;
4>类可以实例化,可以定义自己的字段,属性,方法等等;
5>类可以继承多个接口,但只能继承一个类!
什么是反射?
程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模
块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取
现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建
和使用类型实例
使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?
Web 服务通过WSDL来约定服务器和客户端基于xml的SOAP来通讯,而无论客户端和服务器不需要知道对方的平台、编程语言等信息。.NET Remoting可以通过值或引用传递对象、回调,以及多对象激活和生命周期管理策略等. 虽然.NET Remoting支持使用SOAP,但对于客户端来说还是必须了解服务器对象的详细信息。Web Service 能用于不同平台,不同语言,Remoting 只适用于.Net。效率上Remoting 高于Xml Web Service
类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗?
XMLSchema描述了一种特定的XML必须满足的标准,这些标准可以描述不同的数据类型。CLS是是公共语言规范,它是任何.net 语言(C#,VB.net等)使用的一套数据类型,描述类型系统的一套数据类型描述,它跟XMLSchema有一一对应的数据类型,两者不是互相描述的关系。
从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?
前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生
调用Assembly.Load算静态引用还是动态引用?
动态
何时使用Assembly.LoadFrom?何时使用Assembly.LoadFile?
用LoadFrom加载的是程序集,这就要求同时将此程序集所依赖的程序集加载进来,但位置不同的文件用LoadFrom是不能同时加载进来的(而LoadFile可以)。LoadFile是加载程序集文件的内容,只将传入参数的文件加载,不考虑程序集依赖。由于LoadFile加载的是文件,所以调用它之后,可能因为缺少必要的依赖造成无法被执行
什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不同?
它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。
Assembly.Load("foo.dll");这句话是否正确?
错误,正确的应该是Assembly.Load("foo")或Assembly.Load ("foo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3"); 或者Assembly.LoadFrom("foo.dll");
什么是强签名?做强签名的assembly与不做强签名的assembl有什么不同?
强名称是由程序集的标识加上公钥和数字签名组成的,其中程序集的标识包括简单文本名称,版本号和区域性信息!强签名的程序集可以确认assembly name是唯一的(因为使用了public key token)。强签名的程序集可以做成com。强签名程序集可以安装到GAC中。
DateTime是否可以为null?
不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null
什么叫JIT?什么是NGEN?它们分别有什么限制和好处?
JIT(just in time,即及时编译),它是在程序第一次运行的时候才进行编译,而NGEN是所谓的pre-jit,就是说在运行前事先就将生成程序集的本机镜像,并保存到全局缓存中,适用NGEN可以提高程序集的加载和执行速度,因为它可以从本机映像中还原数代码和数据结构,而不必像jit那样动态生成它们。感觉和缓存的道理大同小异,也就是传说中的预编译
.NET CLR中一代的垃圾收集器是如何管理对象的生命周期的?什么叫非确定性终结?
通过对象的引用计数控制。也就是记录了还有多少个变量在使用这个对象。当计数为0时,就代表对象没有用了,就进入回收条件。
垃圾回收器在系统空闲或内存紧缺以及代码中显示调用回收时自动决定何时启动回收,所以没法确定终结一个对象的具体时间。
Finalize()与Dispose()之间的区别?
Finalize自动释放资源,Dispose()用于手动释放资源
using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的?
有用,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。简单的说调用IDisposable的Dispose方法能移除这个对象所使用资源的引用,从而达到让垃圾收集器回收资源的目的
tasklist /m "mscor*" 这句命令是干嘛的?
列出所有使用了以" mscor"作为开头的dll或者exe的进程和模块信息。
in-proc和out-of-proc的区别
in-proc是进程内,进程内能共享代码和数据块,out-of-proc是进程外,进程外的互操作需要用进程间通讯来实现。
.NET里的哪一项技术能够实现out-of-proc通讯?
.Net Remoting技术或者WCF技术
当你在ASP.NET中运行一个组件时,它在Windows XP, Windows 2000, Windows 2003上分别跑在哪个进程里面?
Xp : aspnet_Wp.exe
Windows 2000 : inetinfo.exe
Windows 2003 : w3wp.exe
高级开发人员/架构师
DateTime.Parse(myString);这行代码有什么问题?
有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse();
PDB是什么东西? 在调试中它应该放在哪里?
PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。
什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?
一种代码复杂度的衡量标准,中文名称叫做圈复杂度。在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,程序的可能错误和高的圈复杂度有着很大关系
什么叫时间复杂度和空间复杂度?
时间复杂度是程序运行的时间,也可以说是次数,空间复杂度是程序占用的空间
如下程序:
int a[1000000];
int cnt = 0;
for(int i = 0; i < 1000; i++)
for(int j = 0; j < 1000; j++)
a[cnt++] = 0;
其中空间主要是开了一个数组a,大小为1000000;时间复杂的是2个for循环,第一个循环做一次,第二个就要做1000次,而第一个要做1000,则总共要做1000×1000次……
如果2个循环分别对应是M,N次,那么要做的次数就是M*N;
写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查", public void LockTest()
{
Object lockObj = new Object();
lock (lockObj)
{
//
}
}
什么叫FullTrust?放入GAC的assembly是否是FullTrust的?
FullTrust完全信任。FullTrust权限基本上允许跳过所有的CAS验证,持有该权限的程序集能够访问所有的标准权限,放入GAC中的Assembly自动赋予FullTrust的权限
代码加上需要安全权限的特性有什么好处?
可以更加灵活的设置对代码的访问权限,实现代码级保护。
gacutil /l | find /i "Corillian" 这句命令的作用是什么?
全局程序集缓存中如果有Corillian就更新该程序集,没有就安装。
sn -t foo.dll 这句命令是干嘛的?
显示程序集foo.dll的公钥标记。
DCOM需要防火墙打开哪些端口?端口135是干嘛用的?
135端口,135是远程过程调用(RPC)的默认端口。
对比OOP和SOA,它们的目的分别是什么?
OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态。而SOA是一个技术框架,SOA的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了OOP的优点。
XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限? XmlSerializer提供了方法,使你能够将自己的对象序列化和反序列化为XML,同时在这个过程中提供一定的控制。这个过程由一些attribute来控制,ACL权限上需要执行程序集的用户拥有对C:/WINDOWS/Temp/的访问权限
为什么不提倡catch(Exception)?
Exception类包含许多子类,程序执行的时候要将每一个类都搜索一遍以找到符合的异常类,这样是蛮消耗资源的,影响程序运行效率。另外,只捕捉特定环境,特定条件下的异常,并进行处理。不应该捕捉所有异常,因为有些异常是我们所无法预料到的,比如,内存溢出或其他错误,这种情况下,不应该让系统以一种未知状态继续运行。
Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。
Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署。debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略。
JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?
JIT编译是以方法为单位完成的,当用到相应的方法才把其编译执行,并将编译结果暂存当下一次用到时就不用再编译。可以一定程度上提高效率。
a.Equals(b)和a == b一样吗?
不一样。a.Equals(b)表示a与b一致, a==b表示a与b的值相等
在对象比较中,对象一致和对象相等分别是指什么?
对象一致指的是两个对象是否指向托管堆中同一个目标,其比较对象的类型与值两个方面。对象相等指的是两个对象中的数据成员是否相等。前者是一种浅比较,后者是一种深比较
在.NET中如何实现深拷贝(deep copy)?
实现深拷贝的程序结构基本如下:
示例代码:
//实现ICloneable接口
public class Copy:ICloneable{
//实现ICloneable接口的Clone()方法
public override object Clone(){
//在此实现深拷贝
}
}
实现深拷贝的代码中,新建一个对象,然后将对象的成员逐个赋值给新对象的成员。最后将新对象返回
请解释一下IClonable
需要实现除MemberwiseClone之外的拷贝方法时(如深拷贝),用户可以实现ICloneable接口,并重写Clone()方法。在Clone()方法中编写自己的实现。
什么叫装箱?
装箱(boxing)是将值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程;拆箱(unboxing)是将引用类型数据转换值类型,比如int j = (int)o;属于拆箱。
XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能
为什么不应该在.NET中使用out参数?它究竟好不好?
当想要一个函数产生多个输出时,可以使用out参数返回函数的输出值。这应该是out参数最大的作用。out参数的缺陷在于,它允许一个未初始化变量就在函数中作为out参数使用。这样并不能保证在访问一个作为out参数的变量时,它已经被初始化过,容易产生错误的结果。
特性能够放到某个方法的参数上?如果可以,这有什么用?
可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限
定输入参数的大小,比如当输入参数小于100的时候便抱错。
对方法的参数设置Attribute的例子
[AttributeUsage(AttributeTargets.Parameter)]
public class ParameterAtt : Attribute{
public int Min = 100;
}
public class AttributeTes {
public void TestMethod([ParameterAtt(Min = 100)] int par1) {
ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0];
ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt)) as ParameterAtt;
if (att.Min > par1)
{
throw new Exception("要求para1最小为" + att.Min);
}
}
}
C#组件开发人员
什么时候使用override?什么时候使用new? 什么叫shadowing?
重写父类的方法的时候用override以实现多态,当你想屏蔽父类成员的时候使用new,shadowing基本就是new与override区别等一些方面的问题,个人认为弄清override与new就没有必要特意考虑shadowing。
解释virtual、sealed、override和abstract的区别?
a. virtual: 允许被子类重写.
b. sealed: 不允许被继承
c. override: 在子类使用, 重写在父类中用virtual, abstract 或 override修饰的函数
d. abstract: 只能被继承, 不能被实例化. 函数本身不能有实现代码, 但是可以有属性
Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d
解释这个字符串每个部分的重要性和作用 ?
程序集的名字、版本(主版本、次版本、内部版本号、修订号)、Culture(文化)如zh-CN,公钥(缩略码),这些是强名程序集的标志。
使用Primary Interop Assembly(PIA)有什么好处?。
PIA是官方发布并经过Sign,可以在不同程序中共享。PIA可能经过某种改动使其比一般Tlbimp生成的Interop DLL要容易使用一些,比如提供一些封装函数。
NUnit是通过什么机制获知需要测试哪些方法的?
反射,为测试方法加上[TestMethodAttribute]。
catch(Exception e){throw e;}和catch(Exception e){throw;}的区别?
将发生的异常对象抛出,另一个只是抛出异常,并没有抛出原异常对象
typeof(foo)和myFoo.GetType()的区别? typeof()为操作符,其操作数为类型,而不能是类的实例。GetType()方法是类型的实例调用的,用于在运行时获得对象的类型。
public class c
{
public c(string a) : this() {;};
public c() {;}
}
解释第一个构造函数中发生了什么?这个构造函数有什么用?
解答:第一个构造函数调用了第二个构造函数,这个构造函数构造了一个c对象的实例。其接受一个string类型的参数。
this是干嘛用的?能够用在static方法中?
this表示通过当前实例访问一个对象,不能用于static中。因为静态函数不需要实例来调用的
解释 <@OutputCache%>和如何使用VaryByParam、VaryByHeader.
@ OutputCache 指令用来以声明方式设置 ASP.NET 页的缓存,它的常用属性如下:
Duration:设置缓存到期时间,单位:秒。
VaryByParam:可用来使缓存输出因查询字符串而异,多个查询字符用分号隔开。
VaryByControl:可用来使缓存输出因控件值而异。
VaryByHeader:可用来使缓存输出因请求的 HTTP 标头而异。
VaryByCustom:可用来使缓存输出因浏览器类型或您定义的自定义字符串而异。
CacheProfile:结合配置文件使用。
Location:设置页的可缓存性,值有Any,Client,Downstream,None,Server,ServerAndClient。
例如: