.Net面試題

初级.NET开发人员 - 任何使用.NET的人都应知道的

1. 描述线程与进程的区别?

进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。进程可以定义程序的一个实例,但它只是占据应用程序所使用的地址空间。为了让进程完成一定的工作,进程必须至少占有一个线程,这个线程即为主线程,默认程序的工作都在这个主线程中完成,可以通过程序创建多个线程,使多个线程可以同时运行(多CPU支持下),这就是多线程技术。

线程(Thread)与进程(Process)二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。同一进程中的不同线程共享代码和数据空间。

2. 什么是Windows服务,它的生命周期与标准的EXE程序有什么不同?

Windows服务是运行在windows后台指定用户下(默认System)的应用程序,它没有标准的UI界面,相比标准的EXE程序,Windows服务是在服务开始的时候创建,而在服务结束的时候销毁,而且可以设置服务是否与操作系统一起启动,一起关闭。它支持三种方式:1)自动方式2)手动方式3)禁用。自动方式下,Windows服务控制器将指导OS启动后自动启动服务并运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被启动。另外标准的EXE默认使用的当前登录的用户,而Windows服务则默认使用System用户,这在对系统资源访问的时候特别需要注意。

3. Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么影响?

这个需要针对硬件平台,公式为单个进程能访问的最大内存量=2的处理器位数次方/2,比如通常情况下,32位处理器下,单个进程所能访问的最大内存量为:232/2 = 2G。单个进程能访问的最大内存量是最大虚拟内存的1/2,因为要分配给操作系统一半虚拟内存。

4. EXE和DLL之间的区间是什么?

EXE文件有一个入口点,比如说Main()函数,这样CLR可以由此处执行这个EXE文件,而DLL不包含这样一个入口点所以不是可执行的。DLL文件主要包含一些程序集供其它函数调用。

5. 什么是强类型,什么是弱类型?哪种更好些?为什么?

强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。没有好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语言,如C#、Java与C++等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如Javascript,VB等。

6. PID是什么?在做系统的故障排除时如何使用它?

PID是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程。可通过Visual Studio将故障进程附加到进程中进行调试。

7. 单个TCP/IP端口上能够被多少个进程侦听?

1个

8. 什么是GAC?它解决了什么问题?

GAC是Global Assembly Cache,全局程序集缓存的简称。它解决了几个程序共享某一个程序集的问题。不必再将那个被共享的程序集拷贝到应用程序目录了,.NET应用程序在加载的时候,会首先查看全局应用程序集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找。

GAC还有一个很重要的作用,所有被放入GAC的程序集都是强名程序集,这样可以保证相同文件名不同版本的程序集被正确的引用,这样解决了COM时代的DLL地狱问题。同时强名还可以防止程序集伪造。

  

中级.NET开发人员

1. 阐述面向接口、面向对象、面向方面编程的区别

面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现,严格的来说,面向接口应该是面向对象中的一部分,因为面向对象也强调的是本末倒置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现。面向对象是对复杂问题的分解。面向方面的编程是一种新概念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码模块化,而无法对和业务无关的代码模块化。而面向方面正是解决这一问题的方案,它的关键思想是“将应用程序中的商业逻辑与对其提供支持的通用服务进行分离”。

2. 什么是Interface?它与Abstract Class有什么区别?

接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类。Interface可以理解为是一种契约。

3. 什么是反射?

程序集包含模块,而模块又包括类型,类型下有成员(这些信息存于元数据中),反射就是在运行时管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例。反射功能的类主要在Sytem.Type命名空间下,使用这些类可以在运行时创建类型实例,然后调用其中方法或访问其成员对象。

4. 使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?

Web服务使用的SOAP协议,而Remoting采用的RPC。Web Service能用于不同平台,不同语言,Remoting只适用于.NET应用程序之间的通信。效率上.NET Remoting高于Web Service。一般情况下Web Service主要应用于互联网,.NET Remoting主要应用于局域网。

5. 类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗?

XmlSchema是一个特定的XML文档必须满足的一套标准。这些标准能够描述不同的数据类型。如xs:decimal是一种XmlSchema数据类型,其他类型有像xs:Boolean,xs:Date,xs:int等等。CLS是公共语言规范(Common Language Specification),它是任何.NET下语言(C#,VB.NET等)使用的一套数据类型。如System.Double是一种CLS数据类型。其他的包括System.Int32,System.Boolean等。

CLS与XMLSchema表述的相同的意思,但其内在不同。

6. 从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?

这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生。

7. 调用Assembly.Load算静态引用还是动态引用?

这种反射操作基本都是动态,即运行时引用。

8. 何时使用Assembly.LoadFrom?何时使用Assembly.LoadFile?

相比LoadFile,用LoadFrom加载程序集时,要求同时将此程序集所依赖的程序集加载进来。而LoadFile加载程序集文件时,只将传入参数的文件加载,不考虑程序集依赖,但如果有相同实现,但位置不同的文件用LoadFrom是不能同时加载进来的,而LoadFile却可以。由于LoadFile加载的是文件,所以调用它之后,可能因为缺少必要的依赖造成无法被执行。

9. 什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不同?

它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。

10. Assembly.Load("foo.dll");这句话是否正确?

错误,正确的应该是Assembly.Load("foo")或者Assembly.LoadFrom("foo.dll")

11. 做强签名的assembly与不做强签名的assembly有什么不同?

强签名程序集可以安装到GAC中,而不做强签名的确不能。强名程序集可以根据强名来区分相同文件名不同版本的程序集。

12. DateTime是否可以为null?

不能,因为DateTime为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null

13. 什么叫JIT?什么是NGEN?它们分别有什么限制和好处?

Just In Time及时编译,它是在程序第一次运行的时候才进行编译,而NGEN是所谓的pre-jit,就是说在运行前事先就将程序集生成为本机镜像,并保存到全局缓存中,运用NGEN可以提高程序集的加载和执行速度,因为它可以从本机映像中还原代码和数据结构,而不必像JIT那样动态生成它们。但是NGEN不能得到JIT编译时优化(如根据处理器)的好处,这是其有缺陷的一方面。

14. .NET CLR中一代的垃圾收集器是如何管理对象的生命周期的?什么叫非确定性终结?

垃圾收集执行的时机不定的,这个过程对于程序员是透明的,垃圾收集器自动控制着它。垃圾收集器的执行原理:周期性地遍历被应用当前引用的所有对象的列表。在这个搜索过程中,凡是没有发现的被引用的对象,都将准备予以销毁(标记为0代)。说明了对象在什么时候终结是不确定的,我认为这就是非确定性终结。通常来说,堆的耗尽是收集清扫的触发条件。

15. Finalize()和Dispose()之间的区别?

Finalize()相当于析构函数,我们不能手动调用这个函数(但可以通过GC.SupperFinalize方法阻止CLR调用Finalize),CLR自动判断什么时候调用这个函数。Dispose()同样用于释放托管资源,但是我们可以在任意时刻自行调用Dispose()方法。总结就是Finalize自动释放资源,Dispose()用于手动释放资源。

16. using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的。

有用。using编译后的MSIL会调用该对象的Dispose方法,释放资源。实现了IDisposable的类相当与一个契约,即说明这个类要实现Dispose()方法告诉CLR怎么释放它自身。因为Dispose()方法释放的非托管资源,所以可以手工调用它来确定性终结一个非托管资源。(托管资源都是非确定性终结,由CLR管理,没法改变)

17. tasklist /m "mscor*" 这句命令是干嘛的?

列出所有使用了以" mscor"作为开头的dll或者exe的映像名称,PID和模块信息。

18. in-proc和out-of-proc的区别

in-proc是进程内,进程内能共享代码和数据块,out-of-proc是进程外,进程外的互操作需要用进程间通讯来实现。

19. .NET里的哪一项技术能够实现out-of-proc通讯?

.Net Remoting技术或者WCF技术

20. 当你在ASP.NET中运行一个组件时,它在Windows XP, Windows 2000, Windows 2003上 分别跑在哪个进程里面?

XP: aspnet_Wp.exe、Windows 2000: aspnet_Wp.exe、Windows 2003: w3wp.exe。XP与2000是IIS5.1,2003是IIS6.0所以有了上述差别。

 

 

 

 

.Net面试题 - 高级

 

1. DateTime.Parse(myString); 这段代码有什么问题?

A:区域信息即CultureInfo没有指定。如果不指定的话,它将采用默认的机器级的设置(见:控制面板->区域和语言选项)并使用这个设置来决定这个字符串即myString怎样被解释。所以如果你传入“5/2/2005”且你的区域设置为En-US,则它会被解释为May 2nd 2005,但是如果你的区域设置为Hindi-India,则它会被解释为5th Feb 2005!

参考下面的代码示例:

复制代码
 1 string sDate = "5/2/2005"; //本意是2005年5月2号
 2 DateTime[] dt = new DateTime[3];
 3 CultureInfo[] cf = new CultureInfo[3];
 4 cf[0] = new CultureInfo("en-US", true); //指定为en-US,字符串将被解释为“MM/DD/YYYY”
 5 dt[0] = DateTime.Parse(sDate, cf[0], DateTimeStyles.AllowWhiteSpaces);
 6 dt[0] = dt[0].AddMonths(1); //另日期变为2005年6月2日
 7 Console.WriteLine(dt[0].ToString(cf[0]));
 8 cf[1] = new CultureInfo("hi-IN", true); //这是印度格式,字符串被解释为“DD/MM/YYYY”
 9 dt[1] = DateTime.Parse(sDate, cf[1], DateTimeStyles.AllowWhiteSpaces);
10 dt[1] = dt[1].AddMonths(1); //让它变成2005年3月5日
11 Console.WriteLine(dt[1].ToString(cf[1]));
复制代码

好了,这解决所有问题了吗?没有!

如果时间放在一个文本框中 – 有些人输入了“2005/02/05” – 我不知道我应该怎样解释这个输入呢! “DateTime.ParseExact” 要求你必须告诉计算机怎样处理输入的日期字符串它才可以处理。

1 //抛出FormatException
2 cf[2] = new CultureInfo("hi-IN", true);
3 dt[2] = DateTime.ParseExact(sDate, new string[] { "d" }, cf[2], DateTimeStyles.AllowWhiteSpaces); //抛出Format Exception
4 dt[2] = dt[2].AddMonths(1);
5 Console.WriteLine(dt[2].ToString(cf[2]));

第二个参数指定了输入字符串的格式 – “d”意思是短日期 – MM/dd/yyyy – 查看.net文档中的DateTimeFormatInfo类中全部的格式。

上面的代码会抛出一个FormatException,因为你没有遵守规则。

好了,现在我们几乎完成了,如果想让一个字符串表达式被接受怎么办呢?

使用一个自定义表达式。如下:

1 sDate = "2005/05/02";
2 dt[2] = DateTime.ParseExact(sDate, new string[] { "%yyyy/MM/dd" }, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces);
3 dt[2] = dt[2].AddMonths(1);
4 Console.WriteLine(dt[2].ToString(cf[2]));

这样就可以接受了

2. PDB是什么东西?在调试时它应该放在哪里?

A:以下是摘自MSDN一段说明A program database file (extension .pdb) is a binary file that contains type and symbolic debugging information gathered over the course of compiling and linking the project. A PDB file is created when you compile a C/C++ program with /ZI or /Zi or a Visual Basic, Visual C#, or JScript program with the /debug option. Object files contain references into the .pdb file for debugging information. For more information on pdb files, see PDB Files (C++). A DIA application can use the following general steps to obtain details about the various symbols, objects, and data elements within an executable image.

翻译后(部分):程序数据库文件(扩展名:pdb)是一个二进制文件包含了在编译和链接项目过程中收集的类型与符号调试信息。PDB文件在你使用/ZI或/Zi参数编译一个C/C++程序或使用/debug参数编译一个Visual Basic, Visual C#或Jscript程序时生成。目标文件含有到.pdb文件的引用以查找调试信息。

下面是查询此文件内容的方法:

  • Acquire a data source by creating an IDiaDataSource interface.
  • Call IDiaDataSource::loadDataFromPdb or IDiaDataSource::loadDataForExe to load the debugging information.
  • Call IDiaDataSource::openSession to open an IDiaSession to gain access to the debugging information.
  • Use the methods in IDiaSession to query for the symbols in the data source.
  • Use the IDiaEnum* interfaces to enumerate and scan through the symbols or other elements of debug information.

调试时,PDB文件应该与待调试文件放在同一目录下。

3. 什么是圈复杂度(Cyclomatic Complexity)?为什么它很重要?

A:圈复杂度一种代码复杂度的衡量标准,中文名称叫做圈复杂度。在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。

4. 写一个标准的lock(),在访问变量的前后创建临界区,要有“双重检查”。

A: 这即是Jeffrey Richter在其经典著作CLR Via C#中提到的双检锁(double-check locking)技巧。如下是原书代码:

复制代码
 1 public sealed class Singleton
 2 {
 3     private static Object s_lock = new Object();
 4     private static Singleton s_value;
 5 
 6     //私有构造器组织这个类之外的任何代码创建实例
 7     private Singleton() { }
 8 
 9     // 下述共有,静态属性返回单实例对象
10     public static Singleton Value
11     {
12         get
13         {
14             // 检查是否已被创建
15             if (s_value == null)
16             {
17                 // 如果没有,则创建
18                 lock (s_lock)
19                 {
20                     // 检查有没有另一个进程创建了它
21                     if (s_value == null)
22                     {
23                         // 现在可以创建对象了
24                         s_value = new Singleton();
25                     }
26                 }
27             }
28 
29             return s_value;
30         }
31     }
32 }
复制代码

5. 什么叫FullTrust?放入CAC的assembly是否是FullTrust的?

FullTrust权限基本上允许跳过所有的CAS验证,持有该权限的程序集能够访问所有的标准权限。GAC中的程序集是具有FullTrust权限的。详细信息参见此文章

6. 代码加上需要安全权限的特性有什么好处?

A: 有可能会通过具有元权限程序集或permview.exe工具访问这些attribute及其参数。有可能在程序集级别使用其中的一些attribute。可以通过反射访问设置信息。最关键一点使程序集开始执行时而不是在执行期间声明需要权限,这样可以确保用户不会在程序开始工作后遇到障碍。

7. gacutil /l | find /i “Corillian”这句命令的作用是什么?

A: gacutil全称.NET Global Assembly Cache Utility。参数/l [ <assembly_name> ]的作用:列出通过 <assembly_name> 筛选出的全局程序集缓存。find命令作用:在文件中搜索字符串,其参数/i作用是搜索字符串时忽略大小写。所以这条命令的意思就是在所有的全局程序缓存中搜索名称包含字符串”Corillian”的程序集。

8. sn -t foo.dll这句命令的作用?

A: sn是.NET Framework 强名称实用工具,其中参数-T[p] <assembly>作用是显示 <assembly> 的公钥的标记(如果使用了-Tp,则还同时显示公钥本身)。此命令显示了foo.dll的公钥。如果foo.dll非强名程序集产生如下提示:未能将密钥转换为标记 -- 程序集“(null)”的公钥无效。

9. DCOM需要防火墙打开哪些端口?端口135是干嘛用的?

A: DCOM动态的选择1024~65535之间的网络端口。此外,DCOM要用135端口实现一些重要的功能。DCOM是使用RPC进行通讯的。利用RPC功能进行通信时,就会向对方电脑的135端口询问可以使用那个端口进行通讯。这样,对方的电脑就会告知可以使用的端口号,实际的通讯将使用这个端口来进行。

135端口起的是动态的决定实际的RPC通讯使用的端口映射功能,主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务。

10. 对比OOP和SOA,它们的目的分别是什么?

面向对象主要用于对具体的事物进行抽象建模,而SOA的主要目的是定义部署和管理服务的方式,采用SOA的架构可以提高可重用性,降低总成本,提高快速修改与演化IT系统的能力。

11. XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?

XmlSerializer提供了方法,使你能够将自己的对象序列化和反序列化为XML,同时在这个过程中提供一定的控制。这个过程由一些attribute来控制。以下是代码示例:

序列化:

1 Theater theater = … ;
2 XmlSerializer xs = new XmlSerializer( typeof ( Theater ) );
3 FileStream fs = new FileStream( args[0], FileMode.Create );
4 xs.Serialize( fs, theater );

反序列化:

1 XmlSerializer xs = new XmlSerializer( typeof ( Theater ) );
2 FileStream fs = new FileStream( args[0], FileMode.Open );
3 Theater theater = (Theater)xs.Deserialize( fs );

控制这个过程:

 [XmlRoot( "theater" )]  -- 序列化xml的根节点

 [XmlElement( "name" )]  -- 序列化为xml的元素及元素名称

 [XmlAttribute( "minutes" )]  -- 序列化为xml中的特性及其名称

 [XmlElement( "showing", DataType="time" )]  -- 序列化为xml的元素及其类型

ACL权限上需要执行程序集的用户拥有对C:\WINDOWS\Temp\的访问权限

12. 为什么不提倡catch(Exception)?

Exception类包含许多子类,程序执行的时候要将每一个类都搜索一遍以找到符合的异常类,这样是蛮消耗资源的,影响程序运行效率。另外,只捕捉特定环境,特定条件下的异常,并进行处理。不应该捕捉所有异常,因为有些异常是我们所无法预料到的,比如,内存溢出或其他错误,这种情况下,不应该让系统以一种未知状态继续运行。

13. Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?

Debug类提供一组帮助调试代码的方法和属性。Trace类提供一组帮助跟踪代码执行的方法和属性,通俗的说就是为在不打断程序的调试或跟踪下,用来记录程序执行的过程。

Debug只在debug状态下会输出,Trace在Release下也会输出,在Release下Debug的内容会消失。

14. Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。

首先以一个表格说明问题:

项目

Debug

Release

条件编译常数

Debug;Trace

Trace

优化代码

False

True

输出路径

bin\Debug

bin\Release

生成调试信息

True

False

Debug模式下生成的程序集为调试版本,未经优化;在bin\debug\目录中有两个文件,除了要生成的.exe或.dll文件外,还有个.pdb文件,这个.pdb文件中就记录了代码中的断点等调试信息;Release模式下不包含调试信息,并对代码进行了优化,\bin\release\目录下只有一个.exe或.dll文件。在项目文件夹下除了bin外,还有个obj目录。编译是分模块编译的,每个模块的编译结果就保存在了obj目录下。最后会合并为一个exe或者dll文件保存到bin之中。因为每次编译都是增量编译,也就是只重新编译改变了的模块,所以这个obj的目录的作用就是保存这些小块的编译结果,加快编译速度。

15. JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?

JIT编译是以方法为单位完成的,当用到相应的方法才把其编译执行,并将编译结果暂存当下一次用到时就不用再编译。可以一定程度上提高效率。

16. 对比抽象基类和接口的使用

如果要让自定义类包含基类的实现,应该选用抽象基类,接口多做契约使用。.NET中类只允许单继承,但接口允许多继承。

17. a.Equals(b)和a==b相同吗?

对于值类型的比较两者效果相同(值类型ValueType重写了Equals方法)。对于除string以外的引用类型==比较对象是否为同一引用,对于string,==比较字符串的内容。而Equals方法对所有引用对象都是比较其是否为同一对象的引用。

很多自定义类都会重写Equals所以不要只注意默认实现。

18. 在对象比较中,对象一致和对象相等分别是指什么?

对象一致指的是两个对象是否指向托管堆中同一个目标,其比较对象的类型与值两个方面。对象相等指的是两个对象中的数据成员是否相等。前者是一种浅比较,后者是一种深比较。

19. 在.NET中如何实现深拷贝(deep copy)?

实现深拷贝的程序结构基本如下:

示例代码:

复制代码
1 //实现ICloneable接口
2 public class Copy : ICloneable
3 {
4     //实现ICloneable接口的Clone()方法 
5     public override object Clone()
6     {
7         //在此实现深拷贝
8     }
9 }
复制代码

实现深拷贝的代码中,新建一个对象,然后将对象的成员逐个赋值给新对象的成员。最后将新对象返回。

20. 请解释一下ICloneable

当用户需要实现除MemberwiseClone之外的拷贝方法时(如深拷贝),用户可以实现ICloneable接口,并重写Clone()方法。在Clone()方法中编写自己的实现。

21. 什么叫装箱。

将值类型对象放到托管堆中需要一个装箱操作。需要装箱的情况有很多,比如将值类型数据存入一个数组(Array类)时,值类型会被装箱然后存入托管堆。

22. string是值类型还是引用类型?

string这个引用类型是非常特殊一个引用类型。

它有两点特殊的地方。第一点对象分配的特殊。例如,有如下语句:

1 string str1 = "abcd"; 
2 string str2 = "abcd"; 

那么.net在分配string类型的时候,先查看当前string类型列表是否有相同的,如果有的话,直接返回其的引用,否则重新分配。

第二点对象引用操作的特殊,即不同于真正意义上的引用操作。例如如下语句:

1 string str1 = "abcd"; 
2 string str2 = str1; 
3 str2 = "efgh";// str1 is still "abcd" here 

当对于一个新的string类型是原有对象引用的时候,这点和一般的引用类型一样,但是当新的对象发生变化的时候,要重新分配一个新的地方,然后修改对象指向。

因此对于string操作的时候,尤其发生变化的时候,会显得比较慢,因为其牵扯到内存地址的变化。(所以对于数据量比较大的字符操作时候,使用StringBuilder来说效率会提升很高。)

23. XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?

这里的属性指attribute。可以将不需要序列化的数据标记为[XmlIgnore],只序列化有用的数据,而不是序列化整个对象。可以省去没有必要序列化的数据序列化工作,提升序列化时的性能。使用attribute还可以指导序列化的过程,以自定义生成xml文档的格式。(11题对XmlSerializer有介绍)

24. 为什么不应该在.NET中使用out参数?它究竟好不好?

当想要一个函数产生多个输出时,可以使用out参数返回函数的输出值。这应该是out参数最大的作用。out参数的缺陷在于,它允许一个未初始化变量就在函数中作为out参数使用。这样并不能保证在访问一个作为out参数的变量时,它已经被初始化过,容易产生错误的结果。(个人观点)

25. 特性能够放到某个方法的参数上?如果可以,这有什么用?

可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。

对方法的参数设置Attribute的例子:

复制代码
 1 [AttributeUsage(AttributeTargets.Parameter)]
 2 public class ParameterAtt : Attribute
 3 {
 4     public int Min = 100;
 5 }
 6 
 7 public class AttributeTest
 8 {
 9     public void TestMethod([ParameterAtt(Min = 100)] int par1)
10     {
11         ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0];
12         ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt)) as ParameterAtt;
13         if (att.Min > par1)
14         {
15             throw new Exception("要求para1最小为" + att.Min);
16         }
17     }
18 }
复制代码

(此问题解答来源于此处

 

 

 

組件開發人員&&XML開發人員

C#组件开发人员

  1. 什么时候使用override?什么时候使用new? 什么叫shadowing?

    重写父类的方法的时候用override以实现多态,当你想屏蔽父类成员的时候使用new,shadowing基本就是new与override区别等一些方面的问题,个人认为弄清override与new就没有必要特意考虑shadowing。

  2. 解释virtual、sealed、override和abstract的区别?

    virtual是声明虚方法的关键字,说明该方法可以被重写,sealed说明该类不可被继承,override重写基类的方法,abstract表明一个类是抽象类或者一个方法是抽象方法,抽象方法不提供实现,由子类中重写这个抽象方法的方法实现,抽象类不可实例化。

  3. Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d 解释这个字符串每个部分的重要性和作用

    程序集的名字、版本(主版本、次版本、内部版本号、修订号)、Culture(文化)如zh-CN,公钥(缩略码),这些是强名程序集的标志。

  4. 解释public、protected、private和internal的区别。

    标记public后可被在类的内部或外部访问,protected只能被其自身内部或其子类访问,private只能在其内部访问,internal只能在相同的程序集中被访问。

  5. 使用Primary Interop Assembly(PIA)有什么好处?

    PIA是官方发布并经过Sign,可以在不同程序中共享。PIA可能经过某种改动使其比一般Tlbimp生成的Interop DLL要容易使用一些,比如提供一些封装函数。

  6. NUnit是通过什么机制获知需要测试哪些方法的?

    反射,为测试方法加上[TestMethodAttribute]。

  7. catch(Exception e){throw e;}和catch(Exception e){throw;}的区别

    将发生的异常对象抛出,另一个只是抛出异常,并没有抛出原异常对象

  8. typeof(foo)和myFoo.GetType()的区别?

    typeof()为操作符,其操作数为类型,而不能是类的实例。GetType()方法是类型的实例调用的,用于在运行时获得对象的类型。

  9.  

    1 public class c 
    2 { 
    3     public c(string a) : this() {} 
    4     public c() {} 
    5 } 

    解释第一个构造函数中发生了什么?这个构造函数有什么用?

    解答:第一个构造函数调用了第二个构造函数,这个构造函数构造了一个c对象的实例。其接受一个string类型的参数。

  10. this是干嘛用的?能够用在static方法中?

    this表示通过当前实例访问一个对象,不能用于static中。

 

XML开发人员

1. XML命名空间的作用?

    当XML文档较为复杂或是需要从别的地方取得内容时,一个文档中有可能会需要不止一个词汇,这样就会产生名称相同而含义不同的元素出现在不同词汇中的情况。命名空间可以指明哪个元素属于哪个词汇。它可以为每个词汇指定唯一的前缀进行识别,再将该前缀应用于XML文档中的元素上。

2. 何时适合使用DOM?何时不适合?有没有尺寸限度?

    等待高手将答案赋予评论中。。致谢!

3. 什么是WS-I基本配置?它重要在哪里?

    WS-I全称为Web服务互操作性组。WS-I 基本配置文件规范 1.1 版是众多供应商为加快真正可互操作 Web 服务的部署而进行的一次尝试,此规范消除了以前规范中的多义性,明确了创建符合规范的 Web 服务的限定,同时从大量可能的设置中选择了一组 Web 服务设置。(源自MSDN)

4. 写一个小XML文档,其中使用的是默认的命名空间,以及一个合法的(前缀)命名空间,其中要有分别属于这两个命名空间的元素。     

复制代码
1 <?xml version="1.0" encoding="UTF-8"?>
2 <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
3     <Folder>
4         <name>临时位置</name>
5     </Folder>
6     <atom:Document>
7         <message></message>
8     </atom:Document>
9 </kml>
复制代码

直接上一段修改过的KML。

5. 元素和特性的基本区别在哪里?

    元素是xml树型结构的节点,其必须成对出现。属性位于一个元素当中。

6. 格式完好的XML和有效的XML有什么区别?

    有效的XML文件是指达到一个xml的最低标准,比如标签需匹配等,如果达不到这个标准则不会被识别为xml文件。有效的xml是指经过DTD或者XSD文件验证的。

7. .NET中如何验证XML?

    这个直接参见微软官方网站的说明。http://support.microsoft.com/kb/307379/zh-cn

8. myXmlDocument.SelectNodes("//mynode"); 为什么这句代码不好?什么时候它是好的?

    如果单纯选择一个名为mynode的节点,这种做法效率不高。只有当要获取名为mynode的节点的集合时可以使用这个语句。

9. 拉式解析(XmlReader)与事件读取器(Sax)的区别

    与 XML 的简单 API (SAX) 读取器类似, XmlReader 是一个只进、只读的游标。它提供了对输入的快速和非缓存的流式访问。它可以读取流或文档。它使用户可以提取数据,并跳过对应用程序没有意义的记录。较大的差异在于 SAX 模型是一个"推送"模型,其中分析器将事件推到应用程序,在每次读取新节点时通知应用程序,而使用 XmlReader 的应用程序可以随意从读取器提取节点。(源自MSDN)

10. XPathDocument和XmlDocument的区别? 在何种情况下应该用哪一个?

    XPathDocument 类使用 XPath 数据模型提供 XML 文档在内存中的快速只读表示形式。XmlDocument 类是实现 W3C 文档对象模型 (DOM) 级别 1 核心和核心 DOM 级别 2 的 XML 文档在内存中的可编辑表示形式。所以区别就在一个只读。

11. "XML片断"与"XML文档"有什么区别

    首先比较重要的一点,XML文档需要有"<?xml version="1.0" encoding="UTF-8"?>"这样的声明。而XML片段不强制。另外貌似XML可以有多个根节点(而XML文档只能有一个根节点)

12. 什么叫格式规范的XML?

类似6题中的解释

13. XML InfoSet规范与Xml DOM有什么不同? InfoSet是要解决什么问题?

    XML 信息集(XML Information Set, Infoset)允许您将一份 XML 文档描述为一系列具有特定属性的对象。而DOM只表示出一个层次关系。所以InfoSet用来更好的用xml表示对象。

14. 比较DTD和XSD,它们的相似点与区别分别是什么?哪个更好些?为什么?

从模式的描述语言来说,XML Schema和XML DTD都属于语法模式。白话一点,就是都用来验证xml的格式。但XML Schema的格式与XML DTD的格式有着非常明显的区别,XML Schema事实上也是XML的一种应用,也就是说XML Schema的格式与XML的格式是完全相同的,而作为SGML DTD的一个子集,XML DTD具有着与XML格式完全不同的格式。所以基于XML格式的XML Schema更具优势。(参考IBM开发者网络http://www.ibm.com/developerworks/cn/xml/x-sd/index.html

15. System.Xml支持DTD吗?如果支持,如何使用?

    第7个问题中的网址解释了这个问题。

16. XML Schema能够表示为对象图?对象图能够表示为XML Schema?

    肯定可以。Vs内置此工具。

 

 

 

.NET面试题 – ASP.NET开发人员

本文大部分问题分析来源自网络,加上部分个人的部分。所有引用表明出处,或直接以网址形式给出。如有不正确支持望及时指出!谢谢!

ASP.NET(UI)开发人员

    1. 阐述一个基于浏览器的Form POST如何变成一个服务器端的事件,如Button1_OnClick。

      对于这个问题看Artech大哥的此文http://www.cnblogs.com/artech/archive/2007/04/06/702658.html足以

    2. 什么是PostBack?

      PostBack即回发,也就是服务器重新生成一次页面并发送给客户端的过程。此处推荐篇阿不同志的文章http://www.cnblogs.com/hjf1223/archive/2008/01/03/1024969.html

    3. 什么是ViewState? 它是否被编码过? 是否被加密过?谁会使用ViewState?

      ViewState是用来在PostBack之间保存信息的工具。这些信息被保存在页面的一个hidden元素中。默认情况下ViewState采用了Base64来编码。所以安全性上存在一定问题。要保护viewstate有两种方式: 一种是防篡改,一种是加密. 一说到防篡改,我们就想起了使用散列代码. 没错, 我们可以在页面顶部加入如下代码:Page EnableViewStateMAC=true。默认情况下asp.net是通过SHA1算法而不是md5算法来生成散列,不过这个可以在machine.config里面配置machineKey validation="MD5"即可。viewstate加密, 只要在machine.config里设置一下machineKey validation="3DES"即可实现用des加密viewstate了。

      像是控件在两次回发之间就需要ViewState来保存状态值,如文本框中的值等。

    4. <machinekey>元素是干嘛用的?它用于哪两项ASP.NET技术?

      machineKey的作用在于下述场景:

      ASP.net 使用 forms authentication 时的 cookie 数据的加密和解密。以确保这部分数据不会被篡改。

      viewstate 数据的加密和解密。以确保这部分数据不会被篡改。

      使用进程外session(out-of-process session)时,对会话状态标识进行验证。

      摘自蝈蝈俊的文章http://blog.joycode.com/ghj/archive/2009/03/18/115516.joy

    5. 说出ASP.NET 1.1中的3种Session State提供程序以及它们的优缺点?

      Process - 进程内。速度比较快,但比较难适应大型应用。

      ASP.NET State Service – ASP.NET状态服务。速度,容量上折中。如果使用专用的状态服务器则可以扩展。

      SQL Server Session State Management:速度较慢。但可靠性是最强的。而且也有很高的扩展性,适合大型应用。

    6. 什么叫Web Gardening? 在设计中如何使用它?

      Web Gardening又称Web园,(注意这与Web Farm即Web场不是一个概念。)Web 园是在单台服务器上通过为应用程序池指定多个工作进程而配置的。而 Web 场则是针对某个网站使用多个服务器。以下对Web园的概念及使用方法的描述引用自TechNet:

      Web园定义

      在 IIS 6.0 工作进程隔离模式下,应用程序池通过隔离应用程序与服务于这些应用程序的工作进程来提高网站或应用程序的可靠性。如果要获得更高的可靠性,可以将应用程序池配置为由多个工作进程支持。使用多个工作进程的应用程序池称为"Web 园"。Web 园中的工作进程将共享到达该特定应用程序池的请求。如果一个工作进程失败,另一个工作进程可以继续处理请求。

      Web园对网站的增强作用

      可靠的请求处理:当应用程序池中的某个工作进程停止处理时(例如,当脚本引擎停止响应时),其他工作进程可以接受并处理该应用程序池的请求。

      • 减少了资源争用:当 Web 园达到稳定状态时,按照循环方案每个新 TCP/IP 连接将分配给 Web 园中的一个工作进程。这可以产生平衡工作负荷和减少绑定到工作进程的资源争用的效果。

      配置 Web 园 - 使用 IIS 管理器(此处只附上这一种配置方法)

      1. 使用管理员账户运行IIS管理器。在 IIS 管理器中,依次展开本地计算机和"应用程序池",右键单击该应用程序池,然后单击"属性"。

      2. 单击"性能"选项卡,然后在"Web 园"下的"最大工作进程数"框中,键入要向应用程序池指定的工作进程数。(要形成 Web 园,必须为应用程序池键入一个大于 1 的数值。)

      3. 单击"确定"。

    7. 假设有一个ASP.NET应用程序,那么单独一个进程中允许多少应用程序对象?那两个进程呢?启用了Web Gardening的2个进程呢?这对设计有何影响?

      一个进程中可以运行一个应用程序池,一个应用程序池可以运行多个应用程序对象,所以单独一个进程中应该可以允许多个应用程序对象。再不配置Web Gardening的情况下一个进程中只能运行一个应用程序池。则两个进程运行两个应用程序池。当配置Web Gardenning后一个应用程序池可以运行在两个或两个以上的进程中。所带来的好处可以见第6问的分析。

    8. ASP.NET会重用多个请求之间的线程吗?是否每个HttpRequest都有自己的线程?你是否应该用ASP.NET的Thread Local存储?

      当有一个耗时较长的操作需要通过异步方式完成时,可以使用ThreadPool利用线程池中的线程来一步进行这个操作。这时线程是可以重用的。每个HttpRequest应该都有自己的线程。另外关于Thread Local存储没有搜到与.net相关的内容。不过顾名思义-线程本地存储应该就是与一个线程相关的变量的存储。参考网上文章所提到的静态方法中用到的静态变量在多线程中会出问题这种说法,个人感觉Thread Local存储可以在一定情况下解决这个问题。

    9. [ThreadStatic]属性在ASP.NET中有用吗?它有没有副作用?是好是坏?

      [ThreadStatic]也可以解决上文上文提到的,静态方法中的静态变量在多线程环境中会出问题的情况。只需要将这些静态变量标记为[ThreadStatic]即可。[ThreadStatic]特性即是可使变量线程唯一。至于副作用,有文章说[ThreadStatic]不是很稳定,在解决此类问题的最好的方法是使用Context Provider来存取与线程相关的数据。关于Context的使用可以参见这篇文章。http://www.cnblogs.com/vwxyzh/archive/2009/02/21/1395416.html

    10. 如何使用HttpHandler简化现有的为.aspx页面提供验证图片的设计 。

      张子阳的这篇文章很好的介绍了这一过程,我就不多废话了,直接上网址。http://www.tracefact.net/Asp-Net/Introduction-to-Http-Handler.aspx

    11. HttpModule订阅的是什么类型的事件? 这对于实现有何影响?如果不打算重新编译ASP.NET应用程序,应该怎么做?

      HttpModule通过对HttpApplication对象的一系列事件的处理来对HTTP处理管道施加影响,这些事件在HttpModule的Init方法中进行注册,包括:

      BeginRequest

      AuthenticateRequest

      AuthorizeRequest

      ResolveRequestCache

      AcquireRequestState

      PreRequestHandlerExecute

      PostRequestHandlerExecute

      ReleaseRequestState

      UpdateRequestCache

      EndRequest

      后两问实在不知原题何意,有待高手出来解答。

    12. 说出表示任意一个终端(URL)的方式,以及ASP.NET中把请求路由到那个终点的方式

      基本上路由一个url的方式是,首先获取请求的url,然后分析,匹配一定规则的话则路由到一个指定的新url。这个过程可以在Global.asax的Application_Start事件处理或自定义的IHttpMoudle的 Application_BeginRequest时间处理函数中完成。可以参看这篇文章,小示例很不错。

      http://niunan.javaeye.com/blog/460681

    13. 解释cookie的工作原理。给出一个滥用Cookie的例子。

      Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息。 如果用户再次访问站点上的页面,如当该用户输入URL:www.cnblogs.com时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到您的站点。

      Cookie最根本的用途是:Cookie 能够帮助 Web 站点保存有关访问者的信息。更概括地说,Cookie 是一种保持Web 应用程序连续性(即执行"状态管理")的方法.使 Web 站点记住您。

      滥用的例子还未发现,但是根据其原理可以看出Cookie需要在Browser与Server间传递的特性决定了其不适合填充太多的内容。

    14. 解释HttpRequest.ValidateInput()的重要性?

      HttpRequest 类使用输入验证标志来跟踪是否对通过 Cookies、 Form 和 QueryString 属性访问的请求集合执行验证。ValidateInput 方法设置这些标志,以便在调用 Cookies、 Form 或 QueryString 属性的 get 访问器时执行输入验证。验证的工作原理是,将所有输入数据与具有潜在危险的数据的硬编码列表进行对照检查。

      如果页指令或配置启用了验证功能,则在页的 ProcessRequest 处理阶段调用此方法。如果未启用验证功能,则可通过代码调用 ValidateInput 方法。

      对此的重要性还没有很深的体会。请高手指点。

    15. 哪些数据是通过HTTP Header传递的?

      HTTP的头域包括通用头,请求头,响应头和实体头四个部分。

      通用头常见的如:Cache-Control头域:Cache-Control指定请求和响应遵循的缓存机制。Date头域:Date头域表示消息发送的时间,时间的描述格式由rfc822定义。Pragma头域:Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。

      请求消息:请求消息如OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等。

      响应消息:主要有5类,1xx:信息响应类,表示接收到请求并且继续处理。2xx:处理成功响应类,表示动作被成功接收、理解和接受。3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理。4xx:客户端错误,客户请求包含语法错误或者是不能正确执行。5xx:服务端错误,服务器不能正确执行一个正确的请求。

      实体:包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。

    16. 对比HTTP动词GET和POST? 什么是HEAD?

      HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和 幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解); 
      在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为"+"号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中; 
      GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

      以上内容摘自:http://www.cnblogs.com/stu-acer/archive/2006/08/28/488802.html

      目前从实际应用来看GET与POST的区别没有那么明显。

      HEAD动词用于请求页面的首部,貌似不常用。

    17. 说出至少6个HTTP状态码以及它们的含义

      列举几个常用的:

      200 OK / 400 Bad Request / 403 Forbidden / 404 Not Found / 500 Internal Server Error / 504 Gateway Timeout

    18. if-not-modified-since的工作原理是什么? 用ASP.NET如何实现它?

      待高手解答。

    19. 解释 <@OutputCache%>和如何使用VaryByParam、VaryByHeader.

      @ OutputCache 指令用来以声明方式设置 ASP.NET 页的缓存,它的常用属性如下:
      Duration:设置缓存到期时间,单位:秒。
      VaryByParam:可用来使缓存输出因查询字符串而异,多个查询字符用分号隔开。
      VaryByControl:可用来使缓存输出因控件值而异。
      VaryByHeader:可用来使缓存输出因请求的 HTTP 标头而异。
      VaryByCustom:可用来使缓存输出因浏览器类型或您定义的自定义字符串而异。
      CacheProfile:结合配置文件使用。
      Location:设置页的可缓存性,值有Any,Client,Downstream,None,Server,ServerAndClient。

      例如:

      <%@ OutputCache Duration="" VaryByParam="" VaryByControl="" VaryByHeader="" VaryByCustom="" CacheProfile="" Location="" %>

      其必备的两个属性为Duration与VaryByParam,如果不需要指定VaryByParam,则将值设置为None。

    20. VaryByCustom是如何工作的?

      VaryByCustom,我们可以自定义输出缓存要求的任意文本。除了在OutputCache指令里面申明该属性之外,我们还得在应用程序的 global.asax 文件的代码声明块中,重写GetVaryByCustomString 方法来为自定义字符串指定输出缓存的行为。

      举例例下:

      <%@ OutputCache VaryByParam="none" VaryByCustom="CategoryPageKey" Location="server" Duration="43200" %>

      这里的VaryByCustom定义的为CategoryPageKey,那么在global.asax里面我们必须定义CategoryPageKey这个字符创输出缓存的行为,见下面代码。

      public override string GetVaryByCustomString(HttpContext context, String arg)

      {}

      主要引自此文,更多详细信息也请参见此文http://www.cnblogs.com/leonjoon/archive/2006/08/27/487747.html

    21. 如何通过q=? (除了q=5)来实现ASP.NET HTML输出缓冲和缓冲过期(比如 http://localhost/page.aspx?q=5)?

      待高手解答

 

 

 

感謝博主--hystar的.Net世界的分享,點擊產看原文連接

转载于:https://www.cnblogs.com/liujiangping/p/4790343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值