.Net 面试题 汇总
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.Net 面试题 汇总相关的知识,希望对你有一定的参考价值。
一.填空题
1.面向对象的语言具有(继承)性、(多态)性、(封装)性。
2.能用foreach遍历访问的对象需要实现 (IEnumberable)接口或声明(GetEnumberator)方法的类型。
3.列举ADO.net中的五个主要对象(Command)、(Connection)、(DataReader)、(DataSet)、(DataAdapter)。
4.C#中的三元运算符是__(?:)__
5.当整数a赋值给一个object对象时,整数a将会被__(装箱)___
6.类成员有__(3)__种可访问形式
7.float f=-123.567F;int i=(int)f;i的值现在是_(-123)__
8.委托声明的关键字是___( delegate) _
9.在Asp.net中所有的自定义用户控件都必须继承自_ (System.Web.UI.UserControl) __
10.在.Net中所有可序列化的类都被标记为__[serializable]___
11.在.Net托管代码中我们不用担心内存漏洞,这是因为有了_ GC __
12.当类T只声明了私有实例构造函数时,则在T的程序文本外部,_不可以_(可以 or 不可以)从T派生出新的类,_不可以_(可以 or 不可以)直接创建T的任何实例。
二.选择题
1.以下叙述正确的是: BC
A. 接口中可以有虚方法。 B. 一个类可以实现多个接口。
C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。
2.从数据库读取记录,你可能用到的方法有: BCD
A. ExecuteNonQuery B. ExecuteScalar
C. Fill D. ExecuteReader
3.对于一个实现了IDisposable接口的类,以下哪些项可以执行与释放或重置非托管资源
相关的应用程序定义的任务?(多选) ( ABC )
A.Close B.Dispose C.Finalize D.using E.Quit
4.以下关于ref和out的描述哪些项是正确的?(多选) ( ACD )
A.使用ref参数,传递到ref参数的参数必须最先初始化。
B.使用out参数,传递到out参数的参数必须最先初始化。
C.使用ref参数,必须将参数作为ref参数显式传递到方法。
D.使用out参数,必须将参数作为out参数显式传递到方法。
5.在对SQL Server 数据库操作时应选用(A)
A.SQL Server .NET Framework 数据提供程序;
B.OLE DB .NET Framework 数据提供程序;
C.ODBC .NET Framework 数据提供程序;
D.Oracle .NET Framework数据提供程序;
6.下列选项中,(C)是引用类型。
A.enum类型 B.struct类型 C.string类型 D.int类型
7.关于ASP.NET中的代码隐藏文件的描述正确的是(C)
A.Web窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。编程逻辑唯一与用户界面不同的文件中。该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名。
B.项目中所有Web窗体页的代码隐藏文件都被编译成.EXE文件。
C.项目中所有的Web窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件。
D.以上都不正确。
8.以下描述错误的是(A)
A.在C++中支持抽象类而在C#中不支持抽象类。
B.C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。
C.在C#中可使用 new 修饰符显式隐藏从基类继承的成员。
D.在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。
9.C#的数据类型有(B)
A.值类型和调用类型 B.值类型和引用类型
C.引用类型和关系类型 D.关系类型和调用类型
10.下列描述错误的是(D)
A.类不可以多重继承而接口可以
B.抽象类自身可以定义成员而接口不可以
C.抽象类和接口都不能被实例化
D.一个类可以有多个基类和多个基接口
11.在DOM中,装载一个XML文档的方法(D)
A.save方法 B.load方法 C.loadXML方法 D.send方法
12.下列关于构造函数的描述正确的是(C)
A.构造函数可以声明返回类型。
B.构造函数不可以用private修饰
C.构造函数必须与类名相同
D.构造函数不能带参数
13.以下是一些C#中的枚举型的定义,其中错误的用法有(A)
A.public enum var1{ Mike = 100, Nike = 102, Jike }
B.public enum var1{ Mike = 100, Nike, Jike }
C.public enum var1{ Mike=-1 , Nike, Jike }
D.public enum var1{ Mike , Nike , Jike }
14.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是(D)
A.9 B.2 C.6 D.越界
15.接口是一种引用类型,在接口中可以声明(A),但不可以声明公有的域或私有的成员变量
A..方法、属性、索引器和事件 B.方法、属性信息、属
C.索引器和字段 D.事件和字段;
16.ASP.NET框架中,服务器控件是为配合Web表单工作而专门设计的。服务器控件有两种类型,它们是(A )
A.html控件和Web控件 B.HTML控件和XML控件
C.XML控件和Web控件 D.HTML控件和IIS控件
17.ASP.NET中,在Web窗体页上注册一个用户控件,指定该控件的名称为”Mike”,正确的注册指令为( D)
A.<%@Register TagPrefix = “Mike” TagName = “Space2” Src = “myX.ascx”%>
B.<%@Register TagPrefix = “Space2” TagName = “Mike” Src = “myX.ascx”%>
C.<%@Register TagPrefix = “SpaceX” TagName = “Space2” Src = “Mike”%>
D.以上皆非
18.在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(C)
A.insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行;
B.ExecuteNonQuery()方法返回执行Sql语句所影响的行数。
C.Select操作的Sql语句只能由ExecuteReader()方法来执行;
D.ExecuteReader()方法返回一个DataReder对象;
19.下列ASP.NET语句(B)正确地创建了一个与SQL Server 2000数据库的连接。
A. SqlConnection con1 = new Connection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
B. SqlConnection con1 = new SqlConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
C. SqlConnection con1 = new SqlConnection(Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB);
D. SqlConnection con1 = new OleDbConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
20.Winform中,关于ToolBar控件的属性和事件的描述不正确的是(D)
A.Buttons属性表示ToolBar控件的所有工具栏按钮
B.ButtonSize属性表示ToolBar控件上的工具栏按钮的大小,如高度和宽度
C.DropDownArrows属性表明工具栏按钮(该按钮有一列值需要以下拉方式显示)旁边是否显示下箭头键
D.ButtonClick事件在用户单击工具栏任何地方时都会触发
21.在ADO.NET中执行一个存储过程时,如果要设置输出参数则必须同时设置参数的方向和(D ),必要时还要设置参数尺寸。
A.大小; B.上限; C.初始值; D.类型
22.如果将窗体的FormBoderStyle设置为None,则( A)。
A.窗体没有边框并不能调整大小; B.窗体没有边框但能调整大小;
C.窗体有边框但不能调整大小; D.窗体是透明的;
23.如果要将窗体设置为透明的,则( B)
A.要将FormBoderStyle属性设置为None; B.要将Opacity属性设置为小于100%的值;
C.要将locked 属性设置为True; D.要将 Enabled属性设置为True;
24.下列关于C#中索引器理解正确的是(B/C )
A.索引器的参数必须是两个或两个以上 B.索引器的参数类型必须是整数型
C.索引器没有名字 D.以上皆非
25.下面描述错误的是( C/D)
A.窗体也是控件; B.窗体也是类; C.控件是从窗体继承来的;D.窗体的父类是控件类
26.要对注册表进行操作则必须包含( D)
A.System.ComponentModel命名空间;B.System.Collections命名空间;
C.System.Threading命名空间; D.Microsoft.Win32命名空间;
27.要创建多文档应用程序,需要将窗体的(D )属性设为true。
A.DrawGrid; B.ShowInTaskbar; C.Enabled; D.IsMdiContainer;
28.如果设treeView1=new TreeView(),则treeView1.Nodes.Add("根节点")返回的是一个 (A)类型的值。
A.TreeNode; B.int; C.string; D.TreeView;
29.下面关于XML的描述错误的是(D)
A.XML提供一种描述结构化数据的方法;
B.XML 是一种简单、与平台无关并被广泛采用的标准;
C.XML文档可承载各种信息;
D.XML只是为了生成结构化文档;
30.装箱、拆箱操作发生在: ( C )
A.类与对象之间 B.对象与对象之间
C.引用类型与值类型之间 D.引用类型与引用类型之间
31.用户类若想支持Foreach语句需要实现的接口是: ( A )
A.Ienumerable B.Ienumerator C.Icollection D.IcollectData
32.Net Framework通过什么与COM组件进行交互操作?( C )
A.Side By Side B.Web Service C.Interop D.PInvoke
33..Net依靠以下哪一项技术解决COM存在的Dll Hell问题的?( A )
A.Side By Side B.Interop C.Pinvoke D.COM+
34.装箱与拆箱操作是否是互逆的操作?( B )
A.是 B.否
35.以下哪个是可以变长的数组?( D )
A.Array B.string[] C.string[N] D.ArrayList
36.用户自定义异常类需要从以下哪个类继承:( A )
A.Exception B.CustomException C.ApplicationException D.BaseException
三、问答题(第一部分)
1) 阐述面向接口、面向对象、面向方面编程的区别
面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现,严格的来说,面向接口应该是面向对象中的一部分吧,因为面向对象也强调的是依赖倒置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现,更具比较的应该是面向接口与面向抽象对象,我的体会是面向接口更加灵活,但实现时候,稍微有些代码冗余,而面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共逻辑,再实现具体实现类。面向对象是对复杂问题的分解。面向方面的编程是一种新概念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码模块化,而无法对和业务无关的代码模块化。而面向方面正是解决这一问题的方案,它的关键思想是"将应用程序中的商业逻辑与对其提供支持的通用服务进行分离"。
2) 什么是Interface?它与Abstract Class有什么区别?
接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类
3) 什么是反射?
程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例
4) 使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?
Web服务使用的消息机制,而Remoting采用的RPC. Web Service能用于不同平台,不同语言,Remoting只适用于.Net。效率上Remoting高于Xml Web Service
5) 类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗?
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#,VB.net等)使用的一套数据类型。例如:一个C#程序可能有这么一行代码:
System.Doublepayrate=21.33;System.Double是一种CLS数据类型。其他的包括System.Int32,System.Boolean等。
那什么是同构(isomorphic)呢?这是真正模棱两可的地方。同构可以不严谨地理解为“有相似的外表但不同的内在”,或者可以理解为“一对一的相似”。如果你将同构理解为有相似的外表,那么这道题的答案是“有点儿”。例如xs:Boolean 和System.Boolean相似。如果你将同构理解为“一对一的相似”那么这道题的答案仍然是“有点儿”。
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"); (多谢 Tristan(Guozhijian)的提示更正)
11) 做强签名的assembly与不做强签名的assembly有什么不同?
强签名的程序集可以做成com,而不做强签名的就不行,同样强签名程序集可以安装到GAC中,而不做强签名的确不能。
12) DateTime是否可以为null?
不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null
13) 什么叫JIT?什么是NGEN?它们分别有什么限制和好处?
Just In Time 及时编译,它是在程序第一次运行的时候才进行编译,而NGEN是所谓的pre-jit,就是说在运行前事先就将生成程序集的本机镜像,并保存到全局缓存中,适用NGEN可以提高程序集的加载和执行速度,因为它可以从本机映像中还原数代码和数据结构,而不必像jit那样动态生成它们。感觉和缓存的道理大同小异。
14) Finalize()和Dispose()之间的区别?
Finalize()用于隐式释放资源,Dispose()用于显示释放资源 (Finalize()的确相当于C++中的析构函数(多谢Jeffrey Zhao提示更正)
15) using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的。
有用,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。不明白什么是确定性终结
16) tasklist /m "mscor*" 这句命令是干嘛的?
列出所有使用了以" mscor"作为开头的dll或者exe的进程和模块信息
17) in-proc和out-of-proc的区别
in-proc是进程内,进程内能共享代码和数据块,out-of-proc是进程外,进程外的互操作需要用进程间通讯来实现。
18) .NET里的哪一项技术能够实现out-of-proc通讯?
.Net Remoting技术或者WCF技术
19) ASP.Net在Windows XP, Windows 2000, Windows 2003上分别跑在哪个进程里面?
Xp : aspnet_Wp.exe
Windows 2000 : aspnet_Wp.exe
Windows 2003 : w3wp.exe
四、问答题(第二部分)
1) DateTime.Parse(myString); 这行代码有什么问题?
有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse() ,同时,还需要注意到文化区域的设置,如果做代码规范检查,该语句也会不符合规范,就是因为缺少文化区域的设置
2) PDB是什么东西? 在调试中它应该放在哪里?
PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。 默认的是同一目录,ide还可以设置全局pdb symbol文件的地址,这也是vs2008能调试.net framework source code的方法。还可以为解决方案指定pdb位置
3) 什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?
所谓圈复杂度是一种代码复杂度的衡量标准,中文名称叫做圈复杂度。在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。它的计算方法很简单,计算公式为:V(G)=e-n+2。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量。其实,圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数,对应的计算公式为:V(G)=区域数=判定节点数+1。
圈复杂度大说明程序代码可能质量低且难于测试和维护。
4) 写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查"
private static object instrace; static object lockedObj = new object(); public static void LockTest() { if (instrace == null) { lock (lockedObj) { if (instance == null) { instance = new object(); } } } }
5) 什么叫FullTrust?放入GAC的assembly是否是FullTrust的?
FullTrust完全信任。放入GAC中的Assembly是否FullTrust我的理解不是。我理解FullTrust是可以通过代码设定的
6) 代码加上需要安全权限的特性有什么好处?
可以更加灵活的设置对代码的访问权限,实现代码级保护。?这点不是特清楚,有明白的给讲解下
7) gacutil /l | find /i "Corillian" 这句命令的作用是什么?
全局程序集缓存中如果有Corillian就更新该程序集,没有就安装
8) sn -t foo.dll 这句命令是干嘛的?
显示程序集foo.dll的公钥标记
9) DCOM需要防火墙打开哪些端口?端口135是干嘛用的?
135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定,有关内容我在http://www.cnblogs.com/jillzhang/archive/2008/02/20/1075057.html 有过一些描述。135是远程过程调用(RPC)的默认端口
10)对比OOP和SOA,它们的目的分别是什么?
我想OOP和SOA应该没有对比性吧。OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态。而SOA是一个技术框架,技术框架和编程模型应该说不是一码事吧?SOA的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了OOP的优点。
11) XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.
12)为什么不提倡catch(Exception)?
原因可能有两点:1)try..catch在出现异常的时候影响性能 2)应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等
13)Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。
14)Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略
15)JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?
方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么
16)对比抽象基类和接口的使用
抽象类能有具体实现,而接口只定义行为规范,不能有具体实现。一个类只能继承一个父类,但能实现多个接口。
17)a.Equals(b)和a == b一样吗?
不一样。多数情况下,a.Equals(b)表示a与b一致, a==b表示a与b的值相等。也可以有具体重载(多谢Jeffrey Zhao 的指正)
18)在对象比较中,对象一致和对象相等分别是指什么?
对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同
19)在.NET中如何实现深拷贝(deep copy)?
实现IClonable接口
20)请解释一下IClonable
IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().
public class Name { public string FirstName; public string LastName; } public class Person:ICloneable { public Name PersonName; public string Email; /// <summary> /// Deep Copy的例子 /// </summary> /// <returns></returns> public Object Clone() { Person p = new Person(); p.Email = this.Email; p.PersonName = new Name(); p.PersonName.FirstName = this.PersonName.FirstName; p.PersonName.LastName = this.PersonName.LastName; return p; } public void ChangLastName(string lastName) { this.PersonName.LastName = lastName; } public static void Main() { Person p = new Person(); p.PersonName = new Name(); p.PersonName.LastName = "jill"; p.PersonName.FirstName = "zhang"; p.Email = "[email protected]"; Person sameNamePerson = p.Clone() as Person; sameNamePerson.ChangLastName("clr_"); Console.WriteLine(p.PersonName.LastName); Console.WriteLine(sameNamePerson.PersonName.LastName); Person samePerson = p.MemberwiseClone() as Person; samePerson.ChangLastName("Shadow"); Console.WriteLine(p.PersonName.LastName); Console.WriteLine(sameNamePerson.PersonName.LastName); Console.Read(); } }
21)什么叫装箱?
装箱(boxing)是将值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程,而拆箱(unboxing)是将饮用类型数据转换值类型,比如int j = (int)o;属于拆箱
22)string是值类型还是引用类型?
引用类型
23)XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。
24)为什么不应该在.NET中使用out参数?它究竟好不好?
我挺喜欢用out参数的,特别是当函数需要有多于1个返回的时候,我比较愿意用out,至于它好不好没研究过 ?
25)特性能够放到某个方法的参数上?如果可以,这有什么用?
可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。
[AttributeUsage(AttributeTargets.Parameter)] public class ParameterAtt : Attribute { public int Min = 100; } public class AttributeTest { 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); } } }
以上是关于.Net 面试题 汇总的主要内容,如果未能解决你的问题,请参考以下文章