net面试复习笔记.docx

上传人:b****5 文档编号:3627643 上传时间:2022-11-24 格式:DOCX 页数:31 大小:44.30KB
下载 相关 举报
net面试复习笔记.docx_第1页
第1页 / 共31页
net面试复习笔记.docx_第2页
第2页 / 共31页
net面试复习笔记.docx_第3页
第3页 / 共31页
net面试复习笔记.docx_第4页
第4页 / 共31页
net面试复习笔记.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

net面试复习笔记.docx

《net面试复习笔记.docx》由会员分享,可在线阅读,更多相关《net面试复习笔记.docx(31页珍藏版)》请在冰豆网上搜索。

net面试复习笔记.docx

net面试复习笔记

.net面试宝典复习笔记

什么是CTS,CLS,CLR?

答:

CLR(commomLauguageRuntime)公共语言运行库

CTS(commonTypeSystem)通用类型系统

CLS(commonLauguageSystem)公共语言系统是CTS的一个子集。

CIL(commonIntermediateLanguage)公共中间语言

标准答案:

CLR是CLI的实现,包含了.net运行引擎和符合CLI(公共语言基础)的类库。

CTS包含在MS提交的CLI规范中,定义了一个可以在CLR上运行的类型规范。

开发和运行.net程序需要的最基本的环境是什么?

答:

需要一个文字编辑器和针对编码语言的编译器。

对c#来说,为csc.exe。

运行.net程序,需要安装.netframwork组件。

Net支持多种编程语言开发,但所有设计必须符合CLS规范以保证编程语言之间的特性差异不会产生运行时的异常。

CLR技术与COM技术的比较

答:

CLR和COM都定义了组件间交互的规范。

COM并没有定义如何描述组件间的依赖性,并且由于其严格的物理约定,造成了很多版本升级和控制的问题。

CLR运用元数据和逻辑类型定义等机制,有效地解决了COM遗留的一些问题。

相对于COM模型,CLR更容易理解和学习。

什么是程序集和应用程序域

答:

程序集(Assembly)是一个由类型定义、数据文件和资源文件组成的逻辑集合。

每个程序集都包含一个程序集清单,该清单通常被附加在某个头文件上,也可以设置单独一个文件来包含该清单。

应用程序域是CLR中提供代码运行范围、错误隔离和安全设置隔离的逻辑单元,功能类似于操作系统的进程。

一个或多个应用程序域在一个操作系统的进程中运行。

应用程序域的创建和销毁所需的开销,相当于操作系统的进程较小。

但和操作系统进程一样,应用程序域之间的数据共享相当困难。

Net程序被编译成什么形式的代码?

答:

.net程序在第一次编译后,形成CLR头、元数据和中间代码。

在实施运行或部署时,将经过第二次编译,编译的结果是在CLR中可执行的机器代码。

JIT是如何工作的?

答:

JIT(justintime)实时编译。

JIT引擎在编译中间代码之前,会寻找方法的本机机器代码缓存并且判断其是否可用,如果可用则直接加载,如果不可用,JIT引擎会查找类型中的方法存根,找到该中间代码并且进行编译。

简述程序集的加载机制。

答:

CLR通过System.Reflection.Asssembly.LoadFrom和System.Reflection.Assemblty.Load来主动地加载程序集。

前者通过位置而后者通过唯一标识强命令程序集的4个元素来标识程序集。

CLR的加载机制和Load方法一致,其内在的策略是依次通过版本策略、CODEBASE位置、应用程序域和应用程序位置来查找程序集。

如何配置程序集的版本策略

答:

CLR支持在3个级别上设定版本策略,依次是:

应用程序策略、发行者策略和计算机策略。

所有策略的设置都是通过修改配置文件(exe.configweb.config)来实现。

3个级别的策略会依次被CLR执行,而上一个策略的执行结果将被作为下一个策略的输入。

发行者策略仅仅针对放入GAC(全集程序集缓存)的程序集,并且可以在应用程序策略中被指定忽略。

如何生成强签名的程序

答:

生成强签名的程序集需要有公钥/私钥对。

在得到了公钥/私钥对后,就可以控制编译器的输入参数来得到一个强签名的程序集。

对于c#的编译器csc来说,可以用/keyfile参数来制定使用哪个公钥/私钥文件。

如何把程序集放入GAC中

答:

GAC全局程序集缓存(GlobalAssemblyCache)。

GAC是一个具有特定目录结构的文件夹,所有强签名的程序集都可以被放入GAC中。

可以通过。

Netfreamwork自带的assemblyviewer来简单地拖动一个程序集到GAC中,也可以使用工具命令行来添加。

总之,任何方法归根到底,都是根据GAC的规范和程序集本身的特性,在GAC目录下建立相应的子目录结构。

延迟签名及其作用

答:

延迟签名就是把强签名程序集的私钥加密和数字签名延迟到实际发布时进行。

延迟签名提高了开发测试阶段的效率,也方便了机构和项目管组管理自己的私钥。

程序集的版本分哪几个部分

答:

程序集的版本号分为四个部分:

主版本号、次版本号、内部版本号和修订号。

面试真题:

1,使用c++语言能否编写可以在.net框架上运行的程序?

2.什么是受托管的代码?

3.什么是应用程序域?

它和进程有什么区别?

4.做强签名的程序集与不做强签名的程序集有什么不同?

5.如何单独升级系统中的某一个程序集。

6.公钥和私钥的概念和作用是什么?

7.把程序集放入GAC中有什么好处?

用什么技术来解决dllhell问题。

9,编译时如何制定版本?

10.延迟签名有何作用?

.net中所有内建类型的基类是什么?

答:

System.Object是.net中所有内建类型的基类。

Object中包含哪些方法?

哪些是虚方法?

答:

包括8个方法

公共实例方法:

VirtualboolEquals(objectobj)

VirtualintGetHashCode()

TypeGetType()

VirtualstringtoString()

公共静态方法

BoolEquals(objectobjA,objectojbB)

BoolreferenceEquals(objectojbA,objectobjB)

受保护的实例方法

ObjectMemberwiseClone()

Finalize

System.ojbect包含了Finalize在内的8个方法。

其中有3个虚方法:

Equals,gethashcode,Tostring方法。

在设计类型时,当需要对类型对象进行内容比较时,可以考虑重写Equals方法。

值类型和引用类型的区别?

答:

所有继承自system.ValueType的类型都是值类型,而其他类型都是引用类型。

值类型的赋值会产生一个新的数据副本,所以每个值类型都拥有一个数据副本,而引用类型的赋值则是赋值引用。

值类型的对象分配在堆栈上,而引用类型的对象分配在堆上。

当比较两个值类型时,进行的是内容比较,而比较两个引用类型时,进行的是引用比较。

三个区别:

赋值区别(将一个赋值给另一个是否会产生副本),即两个值赋值之后,改变其中一个,另外一个是否会跟着改变。

,内存分配区别(堆(引用)和堆栈(值)的区别,堆的空间大,堆栈的空间小,但效率高)

继承结构区别(equals的区别)

值类型的比较方法Equals有了一些改变。

值类型已经实现了内容的比较,而引用类型在没有重写Equals方法的情况下,仍采用引用比较。

简述装箱和拆箱原理

答:

装箱和拆箱本质上是值类型在转换到system.object时引发的堆栈和堆的一系列移动操作。

装箱时值类型从堆栈上被复制到堆上,而拆箱是从堆上复制到堆栈上。

装箱和拆箱对性能有比较大的影响,应该避免任何没有必要的装箱和拆箱操作。

何为装箱,何为拆箱?

答:

所有值类型必然都隐式地转换为System.Object类型,当这个转换发生时,CLR需要做额外的工作把堆栈上的值类型移到堆上,这个操作被称为装箱。

拆箱是装箱操作的反操作,把堆中的对象赋值到堆栈中,并且返回其值。

C#是否有全局变量?

答:

没有传统意义的全局变量,在c#程序中,任何对象数据都必须属于某个类型。

通过公共静态变量,可以实现以前全局变量的所有功能。

publicstaticmain()

Struct和class的区别,struct适合哪些场合?

答:

结构是值类型而类是引用类型。

结构不具备继承的特性,程序员不能定义一个继承自其它结构或者类的结构。

结构虽然可以重写定义system.object中的虚方法,但程序员不能定义新的虚方法和抽象方法。

结构不能拥有无参数的构造方法,也不能为成员变量定义初始值。

结构作为一个微型的值类型的“类”,常用于存储数据的集合,但那些涉及复杂操作的类型,应该被设计成类而不是结构。

类型的初始化器何时被调用?

答:

类型的初始化器是指具有和类型相同名字、无参数无返回并且以static定义的方法。

C#中方法的参数可以有哪几种传递方式?

答:

一共有三个可选关键字可以修饰方法的参数:

ref,out和params.ref和out都实现了参数的引用传递,区别在于ref要求参数是否在传入前被初始化,而out要求参数在方法返回前被初始化,params实现了参数数目可变的方法。

传递数组时是引用传递(意味着改变即改变)

C#中的string和String有什么区别?

答:

在c#中,string和String,object和Object的关系非常简单。

它们是相同的,完全是同一个类型。

在.net中string是String类型的一个别称,而object是Object的一个别称。

String和string是同一个类型的两个名字,相同情况还有object和Object,除了名称之外,没有任何区别。

.net支持几种访问级别?

答:

.net定义了6种,分别为Private,Family,Assembly,Family&Assembly,FamilyorAssembly,Public.

对应的关键字为:

private,protected,internal,protectedinteral,public.

简述属性的特点及属性和方法的异同。

答:

c#属性是指有返回值而无参数的一种特殊的方法,允许程序员方便地为成员变量提供一种set/get(或者其中任意一个)方法,属性的使用和公共成员变量完全一致,却拥有更好的可扩展性。

属性的本质和传统的set/get×××函数一样,但语法更加优美,代码更加简洁易读。

简述c#中的浅复制和深复制

答:

浅复制和深复制的区别?

浅复制是指复制类型中的所有值类型成员,而只复制引用类型成员的引用,并且使目标对象共享原对象的引用类型成员对象。

深复制是指同时复制值类型成员和引用类型成员的对象。

浅复制和深复制的概念都是递归的。

System.Object中的MemberwiseClone已经实现了浅复制,但它是一个受保护的方法。

无论浅复制或深复制,都可以通过实现ICloneable接口的Clone方法来实现,可被继承的类型需要谨慎地实现ICloneable接口,因为这将导致所有的子类型都必须实现ICloneable接口。

 

简述c#中的循环语法和各自的特点

答:

while,dowhile,for,foreach

Forforeach则经常被用来遍历数组和集合。

Foreach语句可以遍历任意实现了IEnumberable接口的容器类,但foreach不允许直接或者通过属性修改每个迭代项目的值。

可以通过调用项目的方法来达到修改的目地。

Foreach语句拥有较好的执行效率和突出的语句健壮性。

C#中的using语句有什么作用?

答:

using语句实现了IDisposable的类型对象调用Dispose方法,using语句能够保证使用的对象的方法在using语句块结束时被调用,无论是否有异常抛出。

C#编译器在编译时自动using语句加上try/finally块,所以using的本质和异常捕捉语句一样。

但语法更为简洁。

所有using使用的对象都应该在using语句开始后再初始化,以保证所有的对象都能够被dispose。

内存管理和垃圾回收

简述.net中堆栈和堆的特点和差异

答:

.net程序在进程内存中分配出堆栈、托管堆和非托管堆。

所有的值类型对象和引用类型对象都分配在堆栈上,堆栈根据对象的生命周期来依次分配和释放,堆栈根据一个指向栈尾的指针来分配内存,效率较高。

.net所有引用类型对象分配在托管堆上,托管堆连续分配内存,并且受net垃圾收集机制管理,受托管的内存分配和释放涉及复杂的内存管理,效率相对堆栈来说低得多。

需要分配堆内存的非托管类型将被分配在非托管堆上,非托管堆不受。

Net垃圾收集机制管理,内存块完全由程序员手动申请和释放。

执行stringabc=”aaa”+”bbb”+”ccc”共分配了多少内存?

答:

在堆栈上分配了一个存储字符串引用的内存块,并在托管堆上分配了一块用于存储“aaabbbccc”这个字符串对象的内存块。

.Net内存分配原则:

引用类型:

在堆栈上分配一个引用对象,在堆上分配一个对象实例

NET中GC的运行机制

答:

垃圾回收是指收集释放托管堆上不再被使用的对象内存。

其过程基本包括:

通过算法找到不再被使用的对象、移动对象使所有仍被使用的对象紧靠托管堆的一边和调整各个状态变量。

垃圾回收的成本较高,对性能的影响较大。

程序员在编写.net代码时,应该避免不必要的内存分配,尽量减少或避免使用GC.Collect来执行垃圾回收。

Dispose方法和Finalize方法在何时被调用

答:

Dispose方法被使用者主动调用,而Finalize方法在对象被垃圾回收的第一轮回收后,由一个专用的.net线程进行调用。

Dispose方法不能保证被执行,而net的垃圾回收机制保证了拥有Finalize方法并且需要被调用的类型对象的Finalize方法被执行。

调用Finalize方法涉及了一系列复杂的操作,性能代价非常高,程序员可以通过GC.SupressFinalize方法通知.net该对象的Finalize方法不需要被调用。

GC中代(Generation)是什么,一共分为几代?

答:

垃圾回收机制按照对象不被使用的可能性把托管堆内的对象分为3代:

0代、1代和2代。

越小的代有越多被释放的机会,而每一次GC中仍存活的对象实例将被移到下一代上。

GC机制中如何判断一个对象是否仍在被使用。

答:

GC通过在使用的根引用遍历所有引用的对象实例。

当一个对象不能被遍历时,将被视为不再被使用。

.NET的托管堆中是否可能出现内存泄漏现象?

答:

可能,主要原因有:

大对象的频繁分配和释放,不恰当地保留根引用和错误的Finalize方法。

C#中类可以有多个父类、可以实现多个接口吗?

答:

C#中最多有一父类,但可以实现任意多的接口。

简述C#中重写、重载和隐藏的概念

答:

重写是指用Override关键字重新实现基类中的虚方法,在运行的过程中,无论通过哪个类型的引用,真正对象类型的方法将被调用。

隐藏是指用new关键字重新实现基类中的方法,在运行过程中通过引用的类型判断应该调用哪个类型的方法。

重载是指多个方法共享同一个名字并且拥有相同的返回值,但是却可以拥有不同的参数列表。

为什么在构造方法中调用虚方法会导致问题?

答:

构造方法中调用虚方法将导致运行时错误。

这是因为当基类的构造方法被调用时,子类的构造方法还未被调用,但是根据实际对象的类型,基类调用的虚方法是定义在子类中的方法,这就意味着一个未完成构造的类型对象的方法,不可预计的错误将发生。

在C#中如何声明一个类不能被继承?

答:

通过关键字sealed可以申明一个类型不可被继承,设计中应该为所有不被作为基类的类型添加sealed关键字,以避免各种来自继承的易产生的错误。

异常的处理

如何针对不同的异常进行捕捉?

答:

C#中一个try块可以有多个catch块,每个catch块可以针对特别的异常进行特别的处理。

但是安全起见,最后应该添加对Exception类型的异常进行捕捉的catch块,以保证没有异常被毫无处理的抛出。

如何使用Conditonal特性

答:

Conditiaonl特性用于编写在某个特定编译版本中运行的方法,通常它编写一些在debug版本中支持测试的方法。

当版本不匹配时,编译器会把Conditonal特性的方法内容置空。

如何避免类型转换时的异常

答:

用is和as语句代替强制转换,可以有效避免InvalidCastException异常,执行效率相对较高。

应使用is或者as语句来代替直接使用强制转换。

面试真题:

1,什么情况下会用到虚方法?

它与接口有什么不同?

关于两者的不同,可以从设计的角度出发,有可以具体列举两者语法的不同。

2.值类型和引用类型有什么区别?

3.怎样理解静态变量?

4.如何是一个类型可以在foreach语句中使用?

(实现IEnumerable接口)

5.new有几种用法?

6.用sealed修饰的类有什么特点?

然后稍微谈一下使得类型不可继承的优点。

7.C#可否对内存进行直接的操作?

指对内存的每一个字节、每一位都能直接读写。

注意。

Net对内存的划分,不同区域的可操作性也不同。

8.。

net错误处理机制是什么?

9.面向对象的语言具有哪些特性?

中垃圾回收机制是怎么样的?

回收的对象,析构方法、如何判断无用对象、Generation的概念?

11.类成员有几种可访问性?

12.什么时候使用Assert。

可以谈谈自己的经验和习惯做法。

System.String是值类型还是引用类型?

答:

是引用类型对象,它的对象在初始化之后就不能再修改,任何试图修改字符串对象的动作将导致一个新的字符串对象的生成。

StringBuilder类型有何作用?

答:

StringBuilder采用构造器设计模式的思想高效地构造一个字符串对象,在构造过程中StringBuilder可以有效避免临时字符串对象的生成。

一旦StringBuilder的ToString方法被调用后,最终的字符串就被生成,而随后的操作将导致一个新的字符串对象的分配。

因为字符串对象的不可修改性,StringBuilder还经常被用来和非托管代码交互。

如何在String和Byte[]对象之间进行转换?

答:

字符串和字节数组的转换依赖于编码方式的使用,不同的编码标准将使用不同的算法进行。

System.Text.Encoding类型提供了大部分常见的编码算法支持,用以进行字符串和字节数组之间的转换。

简述BASE64编码的作用以及C#中对其的支持。

答:

BASE64编码是一种用于混淆明码的编码方式,其算法是把原先的8位字节数组顺序分配到新的6位字节数组中,再在每个字节的高2位填充0来组成新的8位直接数组。

在.net中,Convert类型可以用来进行BASE64字符串和8位字节数组之间的转换。

SecureString的实例如何被分配和释放

答:

System.SecureString提供了加密的字符串类型。

其对象会被分配在非托管的内存中,并且以加密的方式保存。

对于SecureString的操作是逐字符的,SecureString会负责在操作时进解密和加密。

SecureString实现了标准的Dispose/Finalize方法,对象被释放时将先被全部置0,以保证机密信息不会在内存中驻留过长时间。

什么是字符串池机制?

答:

字符串池致力于改善程序的性能。

(主要是对多个字符串赋给相同值的时候,如果没有字符串池的机制,会在内存中产生多个引用,如果采用了字符串值,则对于相同的值,只存在一个应用,从而节省了内存空间)。

CLR会保留程序中出现过的字符串对象的集合,并且在需要新的字符串时,先检查已有的集合,在查找成功时返回已有对象的引用。

字符串池机制可以通过程序集元数据特性进行控制,C#默认的机制是打开字符串池机制。

Int[]是引用类型还是值类型?

答:

数组类型是一族类型,它们都继承自System.Array,而System.Array又继承自system.Object。

所有的数组类型都是引用类型。

.net数组和传统c++数组的区别?

答:

最显著的一点就是,在net中,任何数据类型的数组本身是一个类型,而这个类型保证了数组使用的安全性。

C++程序员会遇到数组越界的问题,在net中这个问题被解决,CLR会检测所有对数组的访问,任何试图访问数组边界以外的代码都会产生一个IndexOutofRangeException的异常。

数组之间如何进行转换?

答:

数组类型在符合条件的情况下可以进行隐式地转换,条件包括:

数组维数必须相同:

目标项目类型和源项目类型必须存在隐式或显式转换关系:

源数组的项目类型不是值类型。

数组类型可以通过Array.ConvertAll方法进行内容转换,该方法需要使用者提供一个转换算法,以委托或者方法的形式传入Array.ConvertAll方法中。

解释泛型的基本原理

答:

泛型类型于c++中的模板,允许程序员定义更通用的类型和算法,并且在具体使用时再生成具体的封闭类型。

所有带泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性,本质上,它和封闭类型没有区别。

什么是泛型的主要约束和次要约束

答:

每个泛型参数可以有至多一个主要约束,泛型的主要约束是指指定泛型参数必须是或者继承自某个引用类型,有两个特殊的主要约束:

class和struct,分别代表泛型参数是引用类型和值类型。

每个泛型参数可以有无限个次要约束,次要约束和主要约束的语法基本相同,但它规定的是某个泛型参数必须实现所有次要约束指定的接口。

NET中是否可用标准模板库(STL)

答:

Wintellect团队为.net开发了STL类库PowerCollection。

这个类库可以免费获得。

鼓励使用标准模板库(STL)。

什么是流,net中有哪些常见的流

答:

流是对字节集合对象的一种操作。

Net中常见的流类型有FileStream,NetworkSteram,UnmanagedMemoryStream,MemoryStream

如何使用压缩流

答:

System.IO.Compression下定义了两个用于压缩数据的类型:

DeflateStream和GZipStream,两者都是流类型并且都继承自System.IO.Stream。

两个类型的操作和其他流类型一样,非常简便。

但相对于一些开源的压缩类库,算法的性能并不高,并且不支持调整压缩率。

Serializable特性有何作用

答:

通过为类型添加Serializable特性,可以使对象申明可被序列化,即可被诸如BinaryFormmater等类型的对象序列化和反序列化。

.NET提供了哪几种可进行序列化操作的类型

答:

.NET内建类型提供了三个可执行序列化和反序列化操作的类型:

BinaryFormatter,SoapFormatter,XmlSerializer.BinaryFromater和SoapForamtter可以对那些有Serializable特性的类型进行序列化和反序列化操作,除了由NonSerialized特性修饰的成员,两者将序列化所有其他的成员。

而XmlSeriaalizer不需要对象类型申明了XmlSerializable特性,但它要求对象类型有一个显式的无参公共构造方法,并且它不能序列化对象的非公共成员和由xmlIgnore修饰的成员。

如何自定义序列化和反序列化的过程

答:

通过实现ISerializable接口中的GetObjectData方法可以实现自定义的序列化,而通过添加带有SerializationInfo和StreamingContext参数的构造方法可以自定义反序列化的过程。

面试真题:

1.如何把一个数组复制到ArrayList里?

反过来从ArrayList到数组呢?

参考微软官方文档中ArrayList类型的说明。

2.stringstr=null;stringstr=””有什么区别,从内存分配的角度考虑。

3.StringBuilder有何作用?

在与非托管

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1