.NET 常见面试题

.NET 常见面试题
面试题1 什么是CTS、CLS和CLR
公共语言运行库(CLR)是一个CLI的一个实现,包含了.NET运行引擎和符合CLI的类库。
通用类型系统(CTS)包含在微软公司提交的CLI规范,定义了一个可以在CLR上运行的类型规范。
公共语言规范是CTS的一个子集,定义了所有面向.NET的程序所需要符合的最小规范集。
面试题2 CLR技术和COM技术的比较
CLR和COM都定义了组件间交互的规范。COM并没有定义如何描述组件间的依赖性,并且由于其严格的物理约定,造成了很多组件版本升级和控制的问题。CLR运用元数据和逻辑类型定义等机制,有效地解决了COM遗留的一些问题。并且,相较于COM模型,笔者认为CLR更容易理解和学习。
面试题3 JIT是如何工作的
JIT引擎在编译中间代码之前,会寻找方法的本机机器代码缓存并且判断其是否可用,如果可用则直接加载,如果不可用,JIT引擎会查找类型中的方法存根,找到该中间代码并且进行编译。
面试题4 怎么把程序集放入GAC中
GAC是一个具有特定目录结构的文件夹,所有强签名的程序集都可以被放入GAC中。可以通过.NET Framework自带的assembly viewer来简单地拖动添加一个程序集到GAC中,也可以利用诸如gacutil.exe等工具使用命令行来添加。总之,任何方法归根结底,都是根据GAC的规范和程序集本身的特性,在GAC目录下建立相应的子目录结构。
面试题5 值类型和引用类型的区别
所有继承自System.ValueType的类型是值类型,而其他类型都是引用类型。值类型的赋值会产生一个新的数据副本,所以每个值类型都拥有一个数据副本,而引用类型的赋值则是赋值引用。值类型的对象分配在堆栈上,而引用类型的对象分配在堆上。当比较两个值类型时,进行的是内容比较,而比较两个引用类型时,进行的是引用比较。
说明:笔者这里列举的,仅仅是值类型和引用类型一些主要的区别,通过这些本质区别,可以产生更多的细节区别,有兴趣的读者可以自己总结整理。
面试题6 C#中string和String有什么区别
String和string是同一个类型的两个名字,相同情况还有Object和object。除了名称之外,两者没有任何区别。
面试题7 简述.NET中堆栈和堆的特点和差异
.NET的程序在进程内存中分配出堆栈、托管堆和非托管堆。所有的值类型对象和引用类型对象的引用都分配在堆栈上,堆栈根据对象的生存周期来依次分配和释放,堆栈根据一个指向栈尾的指针来分配内存,效率较高。
.NET所有引用类型对象分配在托管堆上,托管堆连续分配内存,并且受.NET的垃圾收集机制管理,受托管堆的内存分配和释放涉及复杂的内存管理,效率相对于堆栈来说低地多。
需要分配堆内存的非托管类型将被分配在非托管堆上,非托管堆不受.NET垃圾收集机制管理,内存块完全由程序员手动申请和释放。
面试题8 .NET中GC的运行机制
垃圾回收是指收集释放托管堆上不再被使用的对象内存。其过程基本包括:通过算法找到不再被使用的对象、移动对象使所有仍被使用的对象紧靠托管堆的一边和调整各个状态变量。
垃圾回收的运行成本较高,对性能的影响较大。程序员在编写.NET代码时,应该避免不必要的内存分配,尽量减少或避免使用GC.Collect来执行垃圾回收。
面试题9 简述C#中重写、重载和隐藏的概念
重写是指用override关键字重新实现基类中的虚方法,在运行的过程中,无论通过哪个类型的引用,真正对象类型的方法将被调用。隐藏是指用new关键字重新实现基类中的方法,在运行的过程中通过引用的类型判断应该调用哪个类型的方法。重载是指多个方法共享同一个名字并且拥有相同的返回值,但是却可以拥有不同的参数列表。
面试题10 在C#中如何声明一个类不能被继承
C#中通过关键字:sealed可以申明一个类型不可被继承,设计中应该为所有不被作为基类的类型添加sealed关键字,以避免各种来自继承的易产生的错误。
面试题11 Int[]是引用类型还是值类型
数组类型是一族类型,它们都继承自System.Array,而System.Array又继承自System.Object。所有的数组类型都是引用类型。
面试题12 解释泛型的基本原理
泛型类似C++中的模板,允许程序员定义更通用的类型和算法,并且在具体使用时再生成具体的封闭类型。所有带泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性,本质上,它和封闭类型没有区别。
面试题13 Serializable特性有何作用
通过为类型添加Serialization特性,可以使对象申明为可被序列化,也即是可被诸如BinaryFormmater等类型的对象序列化和反序列化。
面试题14 如何自定义序列化和反序列化的过程
通过实现ISerializable接口中的GetObjectData方法可以实现自定义的序列化,而通过添加带有SerializationInfo和StreamingContext的参数的构造方法可以自定义反序列化的过程。
面试题15 如何使用IFormattable接口实现格式化输出
IFormattable接口帮助类型实现了多样式的格式化输出。IFormattable的ToString方法接受一个代表格式的字符串参数,通过对这个参数的分析来进行格式化输出。另外,IFormattable.ToString方法接受一个IFormatProvider类型的参数,以允许类型的使用者提供格式化的方法。
面试题16 .NET提供了哪几个定时器类型
.NET的内建类型中有三个定时器类型,分别是:
 System.Windows.Forms.Timer类型
 System.Threading.Timer类型
 System.Timers.Timer类型
面试题17 在System.Object中定义的三个比较方法有何异同
静态方法ReferenceEquals实现了引用比较。静态Equals方法实现了比较高效地调用实例Equals方法的功能。实例Equals方法是一个虚方法,默认的实现是引用比较,类型可以根据需要重写实例Equals方法。值类型的基类ValueType重写了Equals方法,实现了内容的比较。
面试题18 请解释委托的基本原理
委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法。委托实现了回调方法的机制,能够帮助程序员设计更加简洁优美的面向对象程序。
面试题19 委托回调静态方法和实例方法有何区别
当委托绑定静态方法时,内部的对象成员变量:_target将会被设置成null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。
面试题20 什么是链式委托
链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。
面试题21 请解释事件的基本使用方法
事件是一种使对象或类能够提供通知的成员。客户端可以通过提供事件处理程序为相应的事件添加可执行代码。事件是一种特殊的委托。
面试题22 请解释反射的基本原理和其实现的基石
反射是一种动态分析程序集、模块、类型、字段等目标对象的机制,它的实现依托于元数据。元数据是存储在PE文件中的数据块,它详细记录了程序集或模块内部的结构、引用的类型和程序集和清单。
面试题23 如何利用反射来实现工厂模式
使用反射可以实现灵活性较高的工厂模式,其关键在于动态地查找产品所包含的所有零件,而不需要通过代码来逐一分析使用者的需求。反射工厂模式具有灵活性高,运行效率相对较低的特点。
面试题24 如何以较小的内存代价保存Type、Field和Method信息
System.RuntimeTypeHandle、System.RuntimeMethodHandle和System.RuntimeFieldHandle三个类型,分别包含了一个指向类型、方法和字段描述的指针,用保存指针的方式来代替保存整个类型、方法和字段的信息描述对象,可以有效地减少内存的消耗。而在实际需要用到这些信息时,又可以通过这三个句柄类型对象,分别得到System.Type、System.Reflection.MethodInfo和System.Reflection.FieldInfo类型对象。
面试题25 什么是线程
线程是微软公司提出的轻量级线程的概念,一个线程拥有自己的栈和寄存器状态。一个线程可以包含多个线程,和线程由操作系统调度所不同的是,线程内线程的调度完全由程序员自己控制,操作系统的内核完全不会知道线程的存在。在.NET架构中,线程的概念不一定和操作系统的线程对应,有些情况下.NET中的线程对应一个线程。
面试题26 如何使用.NET的线程池
System.Threading.ThreaPool类型封装了线程池的操作。每个进程都拥有一个线程池,.NET提供了线程池管理的机制,用户只需要把线程需求插入到线程池中,而不必再理会后续的工作。所有线程池中的线程都是后台线程,他们不会阻碍程序的退出。
面试题27 C#中的lock关键字有何作用
C#中的lock关键字实质是调用Monitor.Enter和Monitor.Exit两个方法的简化语法,功能上其实现了进入和退出某个对象的同步。通常情况下,可以通过lock一个私有的引用成员变量来完成成员方法内的线程同步,而通过lock一个私有的静态引用成员变量来完成静态方法内的线程同步。
面试题28 请解释ASP.NET以什么形式运行
ASP.NET是作为一个ISAPI过滤器程序来运行的,同时它是一个.NET CLR的宿主,从而实现了运行托管的服务器代码的功能。
面试题29 GET请求和POST请求有何区别
HTTP协议中有两种常用的请求:GET和POST。GET请求把表单的数据显示地放在URI中,并且对长度和数据值编码有所限制。POST请求把表单数据放在HTTP请求体中,并且没有长度的限制。
面试题30 介绍ASP.NET的页面生存周期
如果把ASP.NET页面的生存周期步骤做个分类的话,可以大致分为四类:
 初始化
 加载数据和页面
 触发事件
 保存状态并呈现页面
1)初始化
初始化包含上文列出的PreInit、Init和InitComplete三个步骤,其功能包含了初始化类对象、初始化主题主页面等特性,判断是否是第一次访问页面等初始功能。
2)加载数据和页面
这一类型包含了LoadSate、ProcessPostDate、PreLoad、Load、ProcessPostData(第二次)等步骤。
首先从页面回传的数据加载入ViewState对象,所有的数据都会以Base64编码随页面传入服务器。然后开始处理回传的数据,也就是把表单中的键/值对存入对象之中。随后就开始加载页面,程序员通常会在这里做一些初始化的编程,例如在OnLoad事件中编写页面初始化代码。最后会再次执行ProcessPostData,以处理Load时候新添加的数据。
说明:两次执行ProcessPostData通常会让程序员感到困惑,事实上这两次数据处理都是必须的。第一次处理保证了在执行页面加载之前,所有的数据从页面上被读入,这样页面加载时就可以访问这些数
据。而第二次ProcessPostData则是为了使页面加载时新建立的控件中的数据能够得到处理。这两次处理缺一不可。
3)触发事件
触发事件包含了ChangedEvents和PostBackEvent步骤。这里首先会比较ViewState中的数据和页面上一次回传的数据,觉得有哪些事件需要被触发,这里事件是逐一被触发的,但其顺序将无法确定。然后会查看是否触发Post Back事件,该事件也就是页面提交的事件。
4)保存状态并呈现页面
这里会包含SaveState、SaveStateComplete、Render步骤。首先页面会编码保存所有的ViewState数据,然后将其嵌入到页面的一个隐藏控件中。接着转换所有的控件标签并生成页面HTML,并且发送回客户端。
注意:上述分类并没有包含最终的Unload步骤,这是因为这个步骤虽然重要,但从不需要程序员关心,ASP.NET会负责释放所有对象的资源。
面试题31 列举几种实现页面跳转的方法
几乎在每个ASP.NET的应用程序中,都会出现页面跳转的需求,而实现页面跳转也有非常多的方法:
 使用Response.Redirect方法
 使用Server.Transfer方法
 使用Server.Execute方法
 使用javascript脚本
 使用超链接
面试题32 如何防止SQL注入式攻击
SQL注入式攻击时常见的一种攻击方法,主要利用的是系统设计的弊端。程序员在设计时需要考虑到注入式攻击的问题,避免直接使用用户输入拼接SQL语句,适当使用加密数据进行存储,并且在合适的场合使用存储过程。
面试题33 ADO.NET支持哪几种数据源
ADO.NET一共支持四个类别的数据源,分别是:SQL SERVER数据库、ORACLE数据库、OLE DB提供商和ODBC提供商。
面试题34 请简要叙述数据库连接池的机制
ADO.NET对上层用户提供了数据库连接池的服务,使用完的数据库连接将被有选择的保持在数据库连接池中,以供下次使用。当用户以某个连接字符串申请数据库连接时,数据库连接池将尝试寻找在池中寻找具有相同的连接字符串的连接,并直接提供给用户。
面试题35 一个连接字符串可以包含哪些属性
连接字符串包含了丰富的可选属性,在进行数据库操作时,程序员应该对数据库连接字符串进行再三斟酌,不同的设置将适合不同的实际情况。详细的连接字符串属性列表请参考表1。
表1 连接字符串中的属性
关键字
默认值
说明
Application Name
N/A
应用程序的名称,或者“.Net SqlClient Data Provider”(如果不提供应用程序名称)。
Asynch
'false'
如果设置为 true,则启用异步操作支持。可识别的值为 true、false、yes 和 no。
AttachDBFilename
extended properties
Initial File Name
N/A
主数据库文件的名称,包括可连接数据库的完整路径名。该路经可以是绝对路径,也可以是相对路径,这取决于是否使用 DataDirectory 替换字符串。如果使用 DataDirectory,则对应的数据库文件必须存在于替换字符串指向的目录的子目录中。注意:远程服务器、HTTP 及 UNC 路径名不受支持。必须按照如下方式使用关键字“database”(或其别名之一)指定数据库名称:"AttachDbFileName=|DataDirectory|\data\YourDB.mdf;integrated security=true;database=YourDatabase"
Connect Timeout
Connection Timeout
15
在终止尝试并产生错误之前,等待与服务器的连接的时间长度(以秒为单位)。
Context Connection
'false'
如果应对 SQL Server 进行进程内连接,则为 true。
Current Language
N/A
SQL Server 语言记录名称。
Data Source
Server
Address
Addr
Network Address
N/A
要连接的 SQL Server 实例的名称或网络地址。可以在服务器名称之后指定端口号:server=tcp:servername, portnumber。指定本地实例时,始终使用 (local)。若要强制使用某个协议,请添加下列前缀之一:np:(local),tcp:(local), lpc:(local)
Encrypt
'false'
当该值为 true 时,如果服务器端安装了证书,则 SQL Server 将对所有在客户端和服务器之间传送的数据使用 SSL 加密。可识别的值为 true、false、yes 和 no。
Failover Partner
N/A
在其中配置数据库镜像的故障转移合作伙伴服务器的名称。.NET Framework 1.0 或 1.1 版不支持 Failover Partner 关键字。
Initial Catalog
Database
N/A
数据库的名称。
Integrated Security
Trusted_Connection
'false'
当为 false 时,将在连接中指定用户 ID 和密码。当为 true 时,将使用当前的 Windows 帐户凭据进行身份验证。可识别的值为 true、false、yes、no 以及与 true 等效的 sspi。
MultipleActiveResultSets
'true'
如果为 true,则应用程序可以维护多活动结果集 (MARS)。如果为 false,则应用程序必须在执行该连接上的任何其他批处理之前处理或取消一个批处理中的多个结果集。可识别的值为 true 和 false。.NET Framework 1.0 或 1.1 版不支持该关键字。
Network Library
Net
'dbmssocn'
用于建立与 SQL Server 实例的连接的网络库。支持的值包括 dbnmpntw(命名管道)、dbmsrpcn(多协议)、dbmsadsn (Apple Talk)、dbmsgnet (VIA)、dbmslpcn(共享内存)及 dbmsspxn (IPX/SPX) 和 dbmssocn (TCP/IP)。相应的网络 DLL 必须安装在要连接的系统上。如果不指定网络而使用一个本地服务器(比如“.”或“(local)”),则使用共享内存。
Packet Size
8192
用来与 SQL Server 的实例进行通信的网络数据包的大小,以字节为单位。
Password- 或 -Pwd
N/A
SQL Server 帐户登录的密码。为保持高安全级别,可以使用
Integrated Security 或 Trusted_Connection 关键字。
Persist Security Info
'false'
当该值设置为 false 或 no(强烈推荐)时,如果连接是打开的或者一直处于打开状态,那么安全敏感信息(如密码)将不会作为连接的一部分返回。重置连接字符串将重置包括密码在内的所有连接字符串值。可识别的值为 true、false、yes 和 no。
Replication
'false'
如果使用连接来支持复制,则为 true。
TrustServerCertificate
'false'
如果设置为 true,则使用 SSL 对通道进行加密,但不通过证书链对可信度进行验证。如果将 TrustServerCertificate 设置为 true 并将 Encrypt 设置为 false,则不对通道进行加密。可识别的值为 true、false、yes 和 no。
Type System Version
N/A
指示应用程序期望的类型系统的字符串值。
可能的值有:Type System Version=SQL Server 2000;Type System Version=SQL Server 2005;Type System Version=Latest;如果设置为 SQL Server 2000,将使用 SQL Server 2000 类型系统。
与 SQL Server 2005 实例连接时,执行下列转换:XML 到 NTEXT;UDT 到 VARBINARY;VARCHAR(MAX)、NVARCHAR(MAX) 和 VARBINARY(MAX) 分别到 TEXT、NEXT 和 IMAGE。
如果设置为 SQL Server 2005,将使用 SQL Server 2005 类型系统。对 ADO.NET 的当前版本不进行任何转换。如果设置为 Latest,将使用此客户端-服务器对无法处理的最新版本。这个最新版本将随着客户端和服务器组件的升级自动更新。
User ID
N/A
SQL Server 登录帐户。为保持高安全级别,可以使用 Integrated Security 或 Trusted_Connection 关键字。
User Instance
'false'
一个值,用于指示是否将连接从默认的 SQL Server 速成版实例重定向到调用方帐户下运行的运行时启动的实例。
Workstation ID
本地计算机名称
连接到 SQL Server 的工作站的名称。
面试题36 什么是强类型的DataSet
强类型DataSet是指那些固定结构的继承自DataSet的类型,相较于DataSet而言,强类型的DataSet具有访问方便,约束性强的特点,有利于数据访问层的隔离,也有利于把错误提前到编译阶段被发现。
面试题37 什么是XML
XML就是可扩展性标记语言,XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,XML极其简单且易于掌握和使用。
面试题38 XML中的命名空间如何使用
命名空间被用来模块化XML文档中的元素,它以如下形式定义:xmlns:namespace-prefix="namespace"。当解析器试图读取特定命名空间下的节点时,需要指定命名空间的名称。
面试题39 .NET中如何验证一个XML文档的格式
经过W3C组织的推荐,XSD已经成为了最为标准和通用的XML结构定义语言。在.NET中,XmsReader支持使用XSD文件来验证XML文档是否符合特定的格式,程序员需要做的事为其设置包含了指定XSD文件的XmlReaderSetting对象,并且遍历XML文档。
面试题40 什么是XSLT,XSLT有何作用
XSLT是一种对XML文档进行格式转换的语言,其通过XPath来从XML文档中提取所需内容,并且依照特定语法组织新的格式。
面试题41 如何在代码中使用XSLT文档
.NET中所有支持XSL的类型都被定义在System.Xml.Xsl命名空间下,可以使用XslCompiledTransform来进行指定的格式转换。另外,在BS结构系统中,客户端可以使用javascript脚本调用Microsoft.XMLDOM类型,并进行格式转换。
面试题42 请简述SOAP协议
SOAP以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。SOAP协议定义了交互的方式,但并未规定时限协议的环境和技术细节。读者可以参考SOAP协议定义文档,来获取所有的协议内容。
面试题43 如何在.NET中创建Web Service
在.NET中,可以使用内建类型WebService和WebMethod特性来实现Web Service,这种方法使得程序员完全不需要处理和通信有关的工作,而将注意力集中在逻辑工作上。为了获得更大的灵活性,程序员也可以通过实现IHTTPRequest接口来实现定义的asmx资源请求处理类型。更进一步的,程序员可以自定义资源文件和处理程序,来实现完全自定义的Web Service,只需要确保所有的返回都符合SOAP协议。
面试题44 如何生成Web Service代理类型
Web Service代理类是指负责SOAP通信的代理类型,这允许程序员通过调用本地的Web Service代理类型来达到访问Web Service服务器的目的。在.NET中,可以通过使用wsdl.exe工具或者添加Web引用来生成Web Service代理类型,后者可以在服务器端有所变动后方便地更新代理类型。
面试题45 如何提高连接池内连接的重用率
为了提高数据库连接池的重用率,唯一的方法就是尽量保证系统访问数据库所使用的连接字符串不变。例如建立跳板数据库,使所有连接都首先尝试访问跳板数据库。另外,统一使用超级用户帐号可以
进一步统一连接字符串,但这为系统带来了安全上的隐患。
面试题46 ADO.NET支持哪两种方式来访问关系数据库
ADO.NET一共支持两种数据库访问方式,分别是连接式的和脱机式的。连接式的较适合大数据量并且不能准确预测需要读取多少记录的情况,脱机式的更适合进行小数据量的读取操作。
面试题47 什么是关系型数据库
关系型数据库是支持采用了关系模型的数据库,简单来说,关系模型就是指二维表模型。相对于其他模型来说,关系型数据库具有理解更容易、使用更方便、维护更简单等优点。
面试题48 Session有哪几种存储方式,之间有何区别,如何进行设置
Session数据一共有四种存储方式,分别为存储在IIS进程中、状态服务器中、SQL Server数据库中和自定义程序中。除了准备必要的服务外(如SQL Server数据库服务器),还需要配置站点的Web.Config文件进行设置。
说明:可以在Web.Config中设置关闭Session数据,这样会话的数据就不能得到保存。
面试题49 请简述ViewState的功能和实现机制
ViewState用来存储页面范围内的数据,以保证用户在离开页面之前数据的持续性。实现上来说,ViewState被保存在页面内的一个隐藏控件内,并且在提交到服务器后被提取使用。
面试题50 如何使用正则表达式来验证一个上海市电话号码
正则表达式是一种规则的记录。在做数据处理时,通常面对的都是业务逻辑规则,并且需要按照这些逻辑来验证输入、处理数据、并且输出。字符串规则的例子很多,下面就是几个常见的例子:
 中国的身份证以15位数字组成
 上海市的电话号码以021-开头,并紧接着8位数字
 中文姓名限制在6个汉字以内
 HTTP协议的网址以http://打头
 Email地址包含一个@字符
 性别只有两种,分别为“男”和“女”
种种类似的字符串规则,都可以用一个正则表达式来表达。正则表达式虽然语法复杂、难以学习和阅读,但是灵活性相当大,可以表达任意的字符串规则。在BS结构的系统中,正则表达式被大量地使用在表单的验证上,由于无法在客户端限制用户的输入,那表单验证就显得尤为重要,而由于表单本质上是通过字符串类型来提交数据的,所以用正则表达式来验证表单输入非常方便。
上海市的电话号码的正则表达式可以是:021-\d{8}$。在ASP.NET应用程序中有很多方法使用正则表达式来验证一个字符串,而JavaScript脚本是一种便捷有效的方式。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值