NET牛人应该知道些什么
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.NET牛人应该知道些什么?
任何一个使用.NET的人
描述线程与进程的区别?
二者的关系可以简单的一句话概括为,通常, 一个进程可以包括多个线程, 一个线程只能属于一个进程.一个进程可以生成多个线程,而这些线程之前共享地址空间和相应的资源, 在线程切换时, 并没有太多的开销.
图1: 进程的执行空间示意图
图2: 线程的执行空间示意图
1、相同点:
(a)二者都具有ID,一组寄存器,状态,优先级以及所要遵循的调度策略。
(b)每个进程都有一个进程控制块,线程也拥有一个线程控制块。
(c)线程和子进程共享父进程中的资源;线程和子进程独立于它们的父进程,竞争使用处理器资源;线程和子进程的创建者可以在线程和子进程上实行某些控制,比如,创建者可以取消、挂起、继续和修改线程和子进程的优先级;线程和子进程可以改变其属性并创建新的资源。
2、不同点:
(a)线程是进程的一部分, 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
(b)启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。
(c)系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。
对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。
而一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便。
(d)与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
(e)进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在
什么是Windows服务,它的生命周期与标准的EXE程序有什么不同
Windows Service 是一种可随Windows 操作系统启动而启动的,在后台运行的,通常不和用户产生交互的程序。
它无法通过双击来运行,类似于Unix 守护进程(daemon processes),当用户注销时它也不会停止。
Windows 服务由三部分组成:1.一个服务可执行文件;2.一个服务控制程序(SCP);3.服务控制管理器(SCM),负责在HKLM\SYSTEM\CurrentControlSe t\Services 下创建服务键值。
用户可通过SCP 控制服务的启动、停止、暂停等,SCP 会通过SCM 调用服务程序。
Window 标准的exe可执行程序通常有一个用户界面,Console或GUI,通常由用户来启动或停止。
另外标准的EXE默认使用的当前登录的用户,而windows服务则默认使用S ystem用户,这在对系统资源访问的时候特别需要注意
Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么影响?
这个需要针对硬件平台,公式为单个进程能访问的最大内存量=2的处理器位数次方/2,比如通常情况下,32位处理器下,单个进程所能访问的
最大内存量为:2^32 /2 = 2G 。
单个进程能访问的最大内存量是最大虚拟内存的1/2,因为要分配给操作系统一半虚拟内存。
EXE和DLL之间的区别是什么?
EXE就是可执行文件,你可要双击它, 它就可以运行,而DLL是一个动态链接库文件,就是说,它不可以自己运行,它是须要一个程序的其它功能运行的时候,它才能运行,打个比方,如果你的QQ要升级,那QQ里面有关升级的DLL文件它就会运行.
EXE是带有程序入口(Main)的能被终端用户直接执行的应用程序,随着它的启动系统会产生一个相应的进程。
DLL是动态链接库,不包含程序执行入口,不能被终端用户直接执行,本身需要附加到现有
的进程中才可以运行。
但两者都是基于PE格式,运行时由磁盘中的映像载入被调用者的内存或者共享空间中执行,包含程序的数据信息,只是EXE还包括程序的代码信息。
DLL可被多个程序共用,而EXE则不行,只能单独执行。
什么是强类型,什么是弱类型?哪种更好些?为什么?
弱类型语言允许将一块内存看做多种类型。
比如直接将整型变量与字符变量相加。
C and C++ 是静态语言,也是弱类型语言;Perl and PHP 是动态语言,但也是弱类型语言。
强类型语言在没有强制类型转化前,不允许两种不同类型的变量相互操作。
Java、C# 和Python 等都是强类型语言。
使用哪种语言还是要按需而定。
编写简单小应用,使用弱类型语言可节省很多代码量,有更高的开发效率。
而对于构建大型项目,使用强类型语言可能会比使用弱类型更加规范可靠。
PID是什么?在做系统的故障排除时如何使用它?
PID = Process Identifier, 是一个全局唯一的用来标识进程的整数。
在多任务系统中,可用来诊断系统中发生错误的进程。
单个TCP/IP端口上能够侦听多少个进程?
可以为多个,多个为端口复用(多谢蛙蛙池塘的提醒)
看下面代码
Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType. Stream, ProtocolType.Tcp);
Socket socket2 = new Socket(AddressFamily.InterNetwork, Soc ketType.Stream, ProtocolType.Tcp);
socket1.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"),823 5));
socket1.Listen(10);
socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOpti onName.ReuseAddress, true);
socket2.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 823 5));
socket2.Listen(10);
Console.Read();
什么是GAC?它解决了什么问题?
作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。
这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。
举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\\Framework\v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。
除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以
添加自己的Assembly:
1)创建一个strong-name的Assembly,例如ToolbarComponent.dll
2)运行gacutil -i ToolbarComponent.dll,把这个Assembly添加到GAC
3)在程序中动态装载:
System.Reflection.Assembly ass=Assembly.Load("ToolbarComponent, Version=1.0.934.20434, Culture=neutral, PublicKeyToken=65f45658c8d4927f"); MessageBox.Show("Is the assembly loaded from GAC? "+ass.GlobalAssemblyCache); 在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll 文件中装载,程序目录下不需要放置ToolbarComponent.dll程序也能正常运行。
另外,Assembly.Load()中的参数可以通过"gacutil -l"查到。
另外,上面提到了GAC中的Assembly必须是strong-name的。
创建strong-name的Assembly的步骤大致如下:
a) 在命令行运行“sn -k keyPair.snk”创建一个密钥文件。
这里的sn.exe也是.NET附带的一个工具。
b) 在里面修改“AssemblyInfo.cs”文件:
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("..\\..\\keyPair.snk")]
c) 编译项目,就能得到一个strong-name的Assembly。
MSDN中有一些对GAC的介绍,您可以参考:
1)《Assembly Cache Viewer (Shfusion.dll)》
2)《Global Assembly Cache》
.NET Framework中附带了一些和GAC有关的工具,其中包括:
1)Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly
2)Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native Image
3)mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能
中级.NET开发人员
阐述面向接口、面向对象、面向方面编程的区别
面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现,严格的来说,面向接口应该是面向对象中的一部分吧,因为面向对象也强调的是依赖倒置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现,更具比较的应该是面向接口与面向抽象对象,我的体会是面向接口更加灵活,但实现时候,稍微有些代码冗余,而面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共逻辑,再实现具体实现类。
面向对象是对复杂问题的分解。
面向方面的编程是一种新概念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码模块化,而无法对和业务无关的代码模块化。
而面向方面正是解决这一问题的方案,它的关键思想是"将应用程序中的商业逻辑与对其提供支持的通用服务进行分离"。
什么是Interface?它与Class有什么区别?
接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类
什么是反射?
程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。
它是在运行时创建和使用类型实例
使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?
Web服务使用的消息机制,而Remoting采用的RPC. Web Service能用于不同平台,不同语言,Remoting只适用于.Net。
效率上Remoting高于Xml Web Service
类型系统是由XMLSchema表示的吗?CLS是XMLSchema 表示的吗?
类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗? 收藏
这个问题比较模棱两可,首先要解释什么是XmlSchema类型系统,什么是CLS类型系统,和同构(isomorphic)都是什么意思。
XmlSchema是一个特定的XML文档必须满足的一套标准。
这些标准能够描述不同的数据类型。
例如:一个XSD文件(XmlSchema的物理实例化)可能会有一个entry like。
这意味着一个必须满足XSD文件架构的XML文件可能有一个entry like 21.33。
xs:decimal是一种XmlSchema 数据类型。
其他类型包括xs:Boolean,xs:Date,xs:int等等。
CLS是公共语言规范(Common Language Specification),它是任何.net 语言(C#,等)使用的
一套数据类型。
例如:一个C#程序可能有这么一行代码:
System.Double payrate = 21.33;
System.Double是一种CLS数据类型。
其他的包括System.Int32,System.Boolean等。
那什么是同构(isomorphic)呢?这是真正模棱两可的地方。
同构可以不严谨地理解为“有相似的外表但不同的内在”,或者可以理解为“一对一的相似”。
如果你将同构理解为有相似的外表,那么这道题的答案是“有点儿”。
例如xs:Boolean 和System.Boolean相似。
如果你将同构理解为“一对一的相似”那么这道题的答案仍然是“有点儿”。
每一个XmlSchema类型都和CLS类型有那么一点相似,反之亦然。
从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?
这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。
所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生
调用Assembly.Load算静态引用还是动态引用?
动态
何时使用Assembly.LoadFrom?何时使用Assembly.LoadFile?
这个比较有意思,相比LoadFile,LoadFrom则显得不地道,因为它娶媳妇的时候,是让人家穿上嫁妆,坐上马车,还得带着人家的妹妹来,:)用它加载的是程序集,这就要求同时将此程序集所依赖的程序集加载进来。
而LoadFile就地道的多,它是加载程序集文件的内容,只将传入参数的文件加载,不考虑程序集依赖,但如果有相同实现,但位置不同的文件用LoadFrom是不能同时加载进来的,而LoadFile却可以。
由于LoadFile加载的是文件,所以调用它之后,可能因为缺少必要的依赖造成无法被执行。
什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不同?
它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。
因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。
Assembly.Load("foo.dll"); 这句话是否正确?
错误,正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll"); 做强签名的assembly与不做强签名的assembly有什么不同?
强签名的程序集可以做成com,而不做强签名的就不行,同样强签名程序集可以安装到GAC 中,而不做强签名的确不能。
DateTime是否可以为null?
不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null
什么叫JIT?什么是NGEN?它们分别有什么限制和好处?
Just In Time 及时编译,它是在程序第一次运行的时候才进行编译,而NGEN是所谓的pre-jit,就是说在运行前事先就将生成程序集的本机镜像,并保存到全局缓存中,适用NGEN可以提高程序集的加载和执行速度,因为它可以从本机映像中还原数代码和数据结构,而不必像jit那样动态生成它们。
感觉和缓存的道理大同小异。
.NET CLR中一代的垃圾收集器是如何管理对象的生命周期的?什么叫非确定性终结?
1. 调用IL的newobj指令,分配一定空间的内存。
2. 初始化内存空间,比如设置为string类型。
3. 使用对象。
4. 销毁对象,执行清理
5. 回收内存
垃圾收集是在第4步。
有三种方法:Finalize、Dispose、Close。
Finalize()和Dispose()之间的区别?
Finalize()用于隐式释放资源,Dispose()用于显示释放资源(Finalize()的确相当于C++中的析构函数
using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的。
有用,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。
不明白什么是确定性终结
tasklist /m "mscor*" 这句命令是干嘛的?
列出所有使用了以" mscor"作为开头的dll或者exe的进程和模块信息
in-proc和out-of-proc的区别
in-proc是进程内,进程内能共享代码和数据块,out-of-proc是进程外,进程外的互操作需要用进程间通讯来实现。
.NET里的哪一项技术能够实现out-of-proc通讯?
Net Remoting技术或者WCF技术
当你在中运行一个组件时,它在Windows XP, Windows 2000, Windows 2003上分别跑在哪个进程里面?
Xp : aspnet_Wp.exe
Windows 2000 : aspnet_Wp.exe
Windows 2003 : w3wp.exe
高级开发人员/架构师
DateTime.Parse(myString); 这行代码有什么问题?
有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse()
PDB是什么东西? 在调试中它应该放在哪里?
PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。
什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?
一种代码复杂度的衡量标准,英文名称叫Cyclomatic Complexity。
在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。
写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查",
什么叫FullTrust?放入GAC的assembly是否是FullTrust 的?
FullTrust完全信任。
.NET运行时对GAC中的assembly自动赋予Full Trust的权限.
代码加上需要安全权限的特性有什么好处?
gacutil /l | find /i "Corillian" 这句命令的作用是什么?
全局程序集缓存中如果有Corillian就更新该程序集,没有就安装
sn -t foo.dll 这句命令是干嘛的?
显示程序集foo.dll的公钥标记
DCOM需要防火墙打开哪些端口?端口135是干嘛用的?
135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。
因为根本不晓得开哪个端口。
但有解决办法可以使DCOM分配的端口号固定。
135是远程过程调用(RPC)的默认端口
对比OOP和SOA,它们的目的分别是什么?
我想OOP和SOA应该没有对比性吧。
OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态。
而SOA是一个技术框架,技术
框架和编程模型应该说不是一码事吧?SOA的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了OOP的优点。
XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
将对象序列化成为xml数据,反序列化再将xml转换成对象。
应该至少需要ACL权限中的读权限.
为什么不提倡catch(Exception)?
原因可能有两点:1)try..catch在出现异常的时候影响性能2)应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等
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为单位发生还是以方法为单位发生?这对于工作区有何影响?
方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么
对比抽象基类和接口的使用
抽象类能有具体实现,而接口只定义行为规范,不能有具体实现。
一个类只能继承一个父类,但能实现多个接口。
a.Equals(b)和a == b一样吗?
不一样。
多数情况下,a.Equals(b)表示a与b一致,a==b表示a与b的值相等。
也可以有具体重载
在对象比较中,对象一致和对象相等分别是指什么?
对象一致是指两个对象是同一个对象,引用相同。
而对象相等是指两个对象的值相同,但引用不一定相同
在.NET中如何实现深拷贝(deep copy)?
实现IClonable接口
请解释一下IClonable
IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。
深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。
而Shadow复制则不同,是浅表复制,不重新创建新实例。
浅表复制的实现是Object.MemberWiseClone().
什么叫装箱?
装箱(boxing)是将值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程,而拆箱(unboxing)是将饮用类型数据转换值类型,比如int j = (int)o;属于拆箱
string是值类型还是引用类型?
引用类型
XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
只序列化有用的数据,而不是序列化整个对象。
实现没必要的数据冗余,和提升序列化时的性能。
∙为什么不应该在.NET中使用out参数?它究竟好不好?
∙特性能够放到某个方法的参数上?如果可以,这有什么用?
C# 组件开发人员
∙什么时候使用override?什么时候使用new? 什么叫shadowing?
∙解释virtual、sealed、override和abstract的区别
∙Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593 777ae2d274679d 解释这个字符串每个部分的重要性和作用
∙解释public、protected、private和internal的区别
∙使用Primary Interop Assembly (PIA)有什么好处?
∙NUnit是通过什么机制获知需要测试哪些方法的?
∙catch(Exception e){throw e;}和catch(Exception e){throw;}的区别
∙typeof(foo)和myFoo.GetType()的区别?
∙public class c{ public c(string a) : this() {;}; public c() {;} } 解释第一个构造函数中发生了什么?这个构造函数有什么用?
∙this是干嘛用的?能够用在static方法中?
(UI)开发人员
∙阐述一个基于浏览器的Form POST如何变成一个服务器端的事件,如Button 1_OnClick。
∙什么是PostBack?
∙什么是ViewState? 它是否被编码过? 是否被加密过?谁会使用ViewState? ∙<machinekey>元素是干嘛用的?它用于哪两项技术?
∙说出 1.1中的3种Session State提供程序以及它们的优缺点?
∙什么叫Web Gardening? 在设计中如何使用它?
∙假设有一个应用程序,那么单独一个进程中允许多少应用程序对象?
那两个进程呢?启用了Web Gardening的2个进程呢?这对设计有何影响?
∙会重用多个请求之间的线程吗?是否每个HttpRequest都有自己的线程?你是否应该用的Thread Local存储?
∙[ThreadStatic]属性在中有用吗?它有没有副作用?是好是坏?
∙如何使用HttpHandler简化现有的为.aspx页面提供验证图片的设计
∙HttpModule订阅的是什么类型的事件? 这对于实现有何影响?如果不打算重新编译ASP.NE应用程序,应该怎么做?
∙说出表示任意一个终端(URL)的方式,以及中把请求路由到那个终点的方式
∙解释cookie的工作原理。
给出一个滥用Cookie的例子。
∙解释HttpRequest.ValidateInput()的重要性?
∙哪些数据是通过HTTP Header传递的?
∙对比HTTP动词GET和POST? 什么是HEAD?
∙说出至少6个HTTP状态码以及它们的含义
∙if-not-modified-since的工作原理是什么? 用如何实现它?
∙解释<@OutputCache%>和如何使用VaryByParam、VaryByHeader.
∙VaryByCustom是如何工作的?
∙如何通过q=? (除了q=5)来实现 HTML输出缓冲和缓冲过期(比如http://localhost/page.aspx?q=5)?
XML开发人员
∙XML命名空间的作用?
∙何时适合使用DOM?何时不适合?有没有尺度限制?
∙什么是WS-I基本配置?它重要在哪里?
∙写一个小XML文档,其中使用的是默认的命名空间,以及一个合法的(前缀)命名空间,其中要有分别属性这两个命名空间的元素
∙元素和特性的基本区别在哪里?
∙格式完好的XML和有效的XML有什么区别?
∙.NET中如何验证XML?
∙myXmlDocument.SelectNodes("//mynode"); 为什么这句代码不好?什么时候它是好的?
∙拉式解析(XmlReader)与事件读取器(Sax)的区别
∙XPathDocument和XmlDocument的区别? 在何种情况下应该用哪一个?∙“XML片断”与“XML文档”有什么区别
∙什么叫格式规范的XML?
∙XML InfoSet规范与Xml DOM有什么不同? InfoSet是要解决什么问题?∙比较DTD和XSD,它们的相似点与区别分别是什么?哪个更好些?为什么?∙System.Xml支持DTD吗?如果支持,如何使用?
∙XML Schema能够表示为对象图?对象图能够表示为XML Schema?。