2024年1月28日发(作者:)
.net 面试宝典复习笔记
什么是CTS,CLS,CLR?
答:CLR(commom Lauguage Runtime)公共语言运行库
CTS(common Type System)通用类型系统
CLS(common Lauguage System)公共语言系统 是CTS的一个子集。
CIL (common Intermediate Language)公共中间语言
标准答案:CLR 是CLI的实现,包含了.net运行引擎和符合CLI(公共语言基础)的类库。
CTS包含在MS提交的CLI规范中,定义了一个可以在CLR上运行的类型规范。
开发和运行.net程序需要的最基本的环境是什么?
答:需要一个文字编辑器和针对编码语言的编译器。对c#来说,为。运行.net 程序,需要安装.net framwork组件。
Net支持多种编程语言开发,但所有设计必须符合CLS规范以保证编程语言之间的特性差异不会产生运行时的异常。
CLR技术与COM技术的比较
答:CLR和COM都定义了组件间交互的规范。COM并没有定义如何描述组件间的依赖性,并且由于其严格的物理约定,造成了很多版本升级和控制的问题。CLR运用元数据和逻辑类型定义等机制,有效地解决了COM遗留的一些问题。相对于COM模型,CLR更容易理解和学习。
什么是程序集和应用程序域
答:程序集(Assembly)是一个由类型定义、数据文件和资源文件组成的逻辑集合。每个程序集都包含一个程序集清单,该清单通常被附加在某个头文件上,也可以设置单独一个文件来包含该清单。
应用程序域是CLR中提供代码运行范围、错误隔离和安全设置隔离的逻辑单元,功能类似于操作系统的进程。一个或多个应用程序域在一个操作系统的进程中运行。应用程序域的创建和销毁所需的开销,相当于操作系统的进程较小。但和操作系统进程一样,应用程序域之间的数据共享相当困难。
Net程序被编译成什么形式的代码?
答:.net程序在第一次编译后,形成CLR头、元数据和中间代码。在实施运行或部署时,将经过第二次编译,编译的结果是在CLR中可执行的机器代码。
JIT是如何工作的?
答:JIT(just in time)实时编译。JIT引擎在编译中间代码之前,会寻找方法的本机机器代码缓存并且判断其是否可用,如果可用则直接加载,如果不可用,JIT引擎会查找类型中的方法存根,找到该中间代码并且进行编译。
简述程序集的加载机制。
答:CLR通过om 和 来主动地加载程序集。前者通过位置而后者通过唯一标识强命令程序集的4个元素来标识程序集。CLR的加载机制和Load方法一致,其内在的策略是依次通过版本策略、CODEBASE
位置、应用程序域和应用程序位置来查找程序集。
如何配置程序集的版本策略
答:CLR支持在3个级别上设定版本策略,依次是:应用程序策略、发行者策略和计算机策略。所有策略的设置都是通过修改配置文件 ( )来实现。3个级别的策略会依次被CLR执行,而上一个策略的执行结果将被作为下一个策略的输入。发行者策略仅仅针对放入GAC(全集程序集缓存)的程序集,并且可以在应用程序策略中被指定忽略。
如何生成强签名的程序
答:生成强签名的程序集需要有公钥/私钥对。在得到了公钥/私钥对后,就可以控制编译器的输入参数来得到一个强签名的程序集。对于c#的编译器csc 来说,可以用/keyfile 参数来制定使用哪个公钥/私钥 文件。
如何把程序集放入GAC中
答:GAC全局程序集缓存(Global Assembly Cache)。GAC是一个具有特定目录结构的文件夹,所有强签名的程序集都可以被放入GAC中。可以通过。Netfreamwork自带的assembly
viewer 来简单地拖动一个程序集到GAC中,也可以使用工具命令行来添加。总之,任何方法归根到底,都是根据GAC的规范和程序集本身的特性,在GAC目录下建立相应的子目录结构。
延迟签名及其作用
答:延迟签名就是把强签名程序集的私钥加密和数字签名延迟到实际发布时进行。延迟签名提高了开发测试阶段的效率,也方便了机构和项目管组管理自己的私钥。
程序集的版本分哪几个部分
答:程序集的版本号分为四个部分:主版本号、次版本号、内部版本号和修订号。
面试真题:
1,使用c++语言能否编写可以在.net框架上运行的程序?
2.什么是受托管的代码?
3.什么是应用程序域?它和进程有什么区别?
4.做强签名的程序集与不做强签名的程序集有什么不同?
5.如何单独升级系统中的某一个程序集。
6.公钥和私钥的概念和作用是什么?
7.把程序集放入GAC中有什么好处?
用什么技术来解决dll hell问题。
9,编译时如何制定版本?
10.延迟签名有何作用?
.net中所有内建类型的基类是什么?
答:是.net中所有内建类型的基类。
Object中包含哪些方法?哪些是虚方法?
答:包括8个方法
公共实例方法:
Virtual bool Equals(object obj)
Virtual int GetHashCode()
Type GetType()
Virtual string toString()
公共静态方法
Bool Equals(object objA,object ojbB)
Bool referenceEquals(object ojbA, object objB)
受保护的实例方法
Object MemberwiseClone()
Finalize
包含了Finalize 在内的8个方法。其中有3个虚方法:Equals,gethashcode,Tostring方法。在设计类型时,当需要对类型对象进行内容比较时,可以考虑重写Equals方法。
值类型和引用类型的区别?
答:所有继承自ype的类型都是值类型,而其他类型都是引用类型。值类型的赋值会产生一个新的数据副本,所以每个值类型都拥有一个数据副本,而引用类型的赋值则是赋值引用。值类型的对象分配在堆栈上,而引用类型的对象分配在堆上。当比较两个值类型时,进行的是内容比较,而比较两个引用类型时,进行的是引用比较。
三个区别:
赋值区别(将一个赋值给另一个是否会产生副本),即两个值赋值之后,改变其中一个,另外一个是否会跟着改变。
,内存分配区别(堆(引用)和堆栈(值)的区别,堆的空间大,堆栈的空间小,但效率高)
继承结构区别(equals的区别)
值类型的比较方法Equals有了一些改变。
值类型已经实现了内容的比较,而引用类型在没有重写Equals方法的情况下,仍采用引用比较。
简述装箱和拆箱原理
答:装箱和拆箱本质上是值类型在转换到时引发的堆栈和堆的一系列移动操作。装箱时值类型从堆栈上被复制到堆上,而拆箱是从堆上复制到堆栈上。装箱和拆箱对性能有比较大的影响,应该避免任何没有必要的装箱和拆箱操作。
何为装箱,何为拆箱?
答:所有值类型必然都隐式地转换为类型,当这个转换发生时,CLR需要做额外的工作把堆栈上的值类型移到堆上,这个操作被称为装箱。
拆箱是装箱操作的反操作,把堆中的对象赋值到堆栈中,并且返回其值。
C#是否有全局变量?
答:没有传统意义的全局变量,在c#程序中,任何对象数据都必须属于某个类型。通过公共静态变量,可以实现以前全局变量的所有功能。
public static main()
Struct 和class 的区别,struct适合哪些场合?
答:结构是值类型而类是引用类型。结构不具备继承的特性,程序员不能定义一个继承自其它结构或者类的结构。结构虽然可以重写定义中的虚方法,但程序员不能定义新的虚方法和抽象方法。结构不能拥有无参数的构造方法,也不能为成员变量定义初始值。
结构作为一个微型的值类型的“类”,常用于存储数据的集合,但那些涉及复杂操作的类型,应该被设计成类而不是结构。
类型的初始化器何时被调用?
答:类型的初始化器是指具有和类型相同名字、无参数无返回并且以static定义的方法。。。。
C#中方法的参数可以有哪几种传递方式?
答:一共有三个可选关键字可以修饰方法的参数:ref,out和和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, Family or
Assembly ,Public.
对应的关键字为:private,protected,internal,protected interal,public.
简述属性的特点及属性和方法的异同。
答:c#属性是指有返回值而无参数的一种特殊的方法,允许程序员方便地为成员变量提供一种set/get(或者其中任意一个)方法,属性的使用和公共成员变量完全一致,却拥有更好的可扩展性。属性的本质和传统的set/get×××函数一样,但语法更加优美,代码更加简洁易读。
简述c#中的浅复制和深复制
答:浅复制和深复制的区别?
浅复制是指复制类型中的所有值类型成员,而只复制引用类型成员的引用,并且使目标对象共享原对象的引用类型成员对象。深复制是指同时复制值类型成员和引用类型成员的对象。
浅复制和深复制的概念都是递归的。中的MemberwiseClone已经实现了浅复制,但它是一个受保护的方法。无论浅复制或深复制,都可以通过实现ICloneable接口的Clone方法来实现,可被继承的类型需要谨慎地实现ICloneable接口,因为这将导致所有的子类型都必须实现ICloneable接口。
简述c#中的循环语法和各自的特点
答:while ,do while,for, foreach
For foreach 则经常被用来遍历数组和集合。Foreach语句可以遍历任意实现了IEnumberable接口的容器类,但foreach不允许直接或者通过属性修改每个迭代项目的值。可以通过调用项目的方法来达到修改的目地。Foreach语句拥有较好的执行效率和突出的语句健壮性。
C#中的using 语句有什么作用?
答:using语句实现了IDisposable的类型对象调用Dispose方法,using语句能够保证使用的对象的方法在using语句块结束时被调用,无论是否有异常抛出。C#编译器在编译时自动using语句加上try/finally 块,所以using的本质和异常捕捉语句一样。但语法更为简洁。所有using使用的对象都应该在using语句开始后再初始化,以保证所有的对象都能够被dispose。
内存管理和垃圾回收
简述.net中堆栈和堆的特点和差异
答:.net程序在进程内存中分配出堆栈、托管堆和非托管堆。所有的值类型对象和引用类型对象都分配在堆栈上,堆栈根据对象的生命周期来依次分配和释放,堆栈根据一个指向栈尾的指针来分配内存,效率较高。
.net所有引用类型对象分配在托管堆上,托管堆连续分配内存,并且受net垃圾收集机制管理,受托管的内存分配和释放涉及复杂的内存管理,效率相对堆栈来说低得多。
需要分配堆内存的非托管类型将被分配在非托管堆上,非托管堆不受。Net垃圾收集机制管理,内存块完全由程序员手动申请和释放。
执行string abc=”aaa”+”bbb”+”ccc”共分配了多少内存?
答:在堆栈上分配了一个存储字符串引用的内存块,并在托管堆上分配了一块用于存储“aaabbbccc”这个字符串对象的内存块。
.Net内存分配原则:
引用类型:在堆栈上分配一个引用对象,在堆上分配一个对象实例
NET中GC的运行机制
答:垃圾回收是指收集释放托管堆上不再被使用的对象内存。其过程基本包括:通过算法找到不再被使用的对象、移动对象使所有仍被使用的对象紧靠托管堆的一边和调整各个状态变量。
垃圾回收的成本较高,对性能的影响较大。程序员在编写.net代码时,应该避免不必要的内存分配,尽量减少或避免使用t来执行垃圾回收。
Dispose方法和Finalize方法在何时被调用
答:Dispose方法被使用者主动调用,而Finalize方法在对象被垃圾回收的第一轮回收后,由一个专用的.net线程进行调用。Dispose方法不能保证被执行,而net的垃圾回收机制保证了拥有Finalize方法并且需要被调用的类型对象的Finalize方法被执行。调用Finalize方法涉及了一系列复杂的操作,性能代价非常高,程序员可以通过sFinalize方法通知.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接口)
有几种用法?
6.用sealed修饰的类有什么特点?然后稍微谈一下使得类型不可继承的优点。
7.C#可否对内存进行直接的操作?
指对内存的每一个字节、每一位都能直接读写。注意。Net对内存的划分,不同区域的可操作性也不同。
8.。net错误处理机制是什么?
9.面向对象的语言具有哪些特性?
10..net中垃圾回收机制是怎么样的?回收的对象,析构方法、如何判断无用对象、Generation的概念?
11.类成员有几种可访问性?
12.什么时候使用Assert 。可以谈谈自己的经验和习惯做法。
是值类型还是引用类型?
答:是引用类型对象,它的对象在初始化之后就不能再修改,任何试图修改字符串对象的动作将导致一个新的字符串对象的生成。
StringBuilder类型有何作用?
答:StringBuilder采用构造器设计模式的思想高效地构造一个字符串对象,在构造过程中StringBuilder可以有效避免临时字符串对象的生成。一旦StringBuilder的ToString方法被调用后,最终的字符串就被生成,而随后的操作将导致一个新的字符串对象的分配。因为字符串对象的不可修改性,StringBuilder还经常被用来和非托管代码交互。
如何在String和Byte[]对象之间进行转换?
答:字符串和字节数组的转换依赖于编码方式的使用,不同的编码标准将使用不同的算法进行。ng类型提供了大部分常见的编码算法支持,用以进行字符串和字节数组之间的转换。
简述BASE64编码的作用以及C#中对其的支持。
答:BASE64编码是一种用于混淆明码的编码方式,其算法是把原先的8位字节数组顺序分配到新的6位字节数组中,再在每个字节的高2位填充0来组成新的8位直接数组。在.net中,Convert类型可以用来进行BASE64字符串和8位字节数组之间的转换。
SecureString的实例如何被分配和释放
答:String提供了加密的字符串类型。其对象会被分配在非托管的内存中,并且以加密的方式保存。对于SecureString的操作是逐字符的,SecureString会负责在操作时进解密和加密。SecureString实现了标准的 Dispose/Finalize方法,对象被释放时将先被全部置0,以保证机密信息不会在内存中驻留过长时间。
什么是字符串池机制?
答:字符串池致力于改善程序的性能。(主要是对多个字符串赋给相同值的时候,如果没有字符串池的机制,会在内存中产生多个引用,如果采用了字符串值,则对于相同的值,只存在一个应用,从而节省了内存空间)。CLR会保留程序中出现过的字符串对象的集合,并且
在需要新的字符串时,先检查已有的集合,在查找成功时返回已有对象的引用。
字符串池机制可以通过程序集元数据特性进行控制,C#默认的机制是打开字符串池机制。
Int[]是引用类型还是值类型?
答:数组类型是一族类型,它们都继承自,而又继承自。所有的数组类型都是引用类型。
.net数组和传统c++数组的区别?
答:最显著的一点就是,在net中,任何数据类型的数组本身是一个类型,而这个类型保证了数组使用的安全性。C++程序员会遇到数组越界的问题,在net中这个问题被解决,CLR会检测所有对数组的访问,任何试图访问数组边界以外的代码都会产生一个IndexOutofRange Exception的异常。
数组之间如何进行转换?
答:数组类型在符合条件的情况下可以进行隐式地转换,条件包括:数组维数必须相同:目标项目类型和源项目类型必须存在隐式或显式转换关系:源数组的项目类型不是值类型。
数组类型可以通过tAll方法进行内容转换,该方法需要使用者提供一个转换算法,以委托或者方法的形式传入tAll方法中。
解释泛型的基本原理
答:泛型类型于c++中的模板,允许程序员 定义更通用的类型和算法,并且在具体使用时再生成具体的封闭类型。所有带泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性,本质上,它和封闭类型没有区别。
什么是泛型的主要约束和次要约束
答:每个泛型参数可以有至多一个主要约束,泛型的主要约束是指指定泛型参数必须是或者继承自某个引用类型,有两个特殊的主要约束:class 和struct,分别代表泛型参数是引用类型和值类型。
每个泛型参数可以有无限个次要约束,次要约束和主要约束的语法基本相同,但它规定的是某个泛型参数必须实现所有次要约束指定的接口。
NET中是否可用标准模板库(STL)
答:Wintellect团队为.net开发了STL类库Power Collection。这个类库可以免费获得。鼓励使用标准模板库(STL)。
什么是流,net中有哪些常见的流
答:流是对字节集合对象的一种操作。Net中常见的流类型有FileStream,NetworkSteram,UnmanagedMemoryStream,MemoryStream
如何使用压缩流
答:ssion下定义了两个用于压缩数据的类型:DeflateStream 和GZipStream,两者都是流类型并且都继承自。两个类型的操作和其他流类型一样,非常简便。但相对于一些开源的压缩类库,算法的性能并不高,并且不支持调整压缩率。
Serializable特性有何作用
答:通过为类型添加Serializable特性,可以使对象申明可被序列化,即可被诸如BinaryFormmater等类型的对象序列化和反序列化。
.NET提供了哪几种可进行序列化操作的类型
答:.NET内建类型提供了三个可执行序列化和反序列化操作的类型:BinaryFormatter,SoapFormatter,XmlSerializer. BinaryFromater 和SoapForamtter可以对那些有Serializable特性的类型进行序列化和反序列化操作,除了由NonSerialized特性修饰的成员,两者将序列化所有其他的成员。而XmlSeriaalizer不需要对象类型申明了XmlSerializable特性,但它要求对象类型有一个显式的无参公共构造方法,并且它不能序列化对象的非公共成员和由xmlIgnore修饰的成员。
如何自定义序列化和反序列化的过程
答:通过实现ISerializable接口中的GetObjectData方法可以实现自定义的序列化,而通过添加带有SerializationInfo和StreamingContext参数的构造方法可以自定义反序列化的过程。
面试真题:
1.如何把一个数组复制到ArrayList里?反过来从ArrayList到数组呢?
参考微软官方文档中ArrayList类型的说明。
str=null; string str=”” 有什么区别,从内存分配的角度考虑。
Builder 有何作用? 在与非托管代码交互时也有其作用。
4.解释泛型有什么好处?
5.拥有这样一个字符串数组{“2”,”3”,”4”}。如何转换为整数数组?
考虑Array 的静态方法
6.什么是序列化?.Net中如何实现序列化?
7.什么是编码?什么是Unicode。
64编码主要应用在哪些场合?
9.字符串池是如何提高系统性能的?
10.加密字符串和普通字符串的类型有和不同?
是否存在不继承自类型的类?
答:通过运用的noautoinherit开关,可以生成不从继承的类型,这种类型不是安全的类型,不建议使用。但是,这样机制的存在,促使程序员在编写代码时不能随意地把任何对象看成的之类类型。
在中定义的三个比较方法的异同
答:三个比较方法是:
Static bool ReferenceEquals(object A,object B)
Static bool Equals(object A, object B)
Virtural Equals(object obj)
静态方法ReferenceEquals实现了引用比较。静态Equals方法实现了比较高效地调用实例Equals方法的功能。实例Equals方法是一个虚方法,默认的实现是引用比较,类型可以根据需要重写实例Equals方法,值类型的基类ValueType重写了Equals方法,实现了内容的
比较。
如何重写GetHashCode方法
答:Object中GetHashCode的算法保证了同一对象返回同一HashCode,而不同对象则返回不同的Hashcode,但对于值类型等视内容相等的对象为相等对象的类型时,默认的GetHashCode算法并不正确。
重写GetHashCode必须保证同一对象无论何时都返回同一hashcode值,而相等的对象也必须返回相同的值。并且在此基础上,保证Hashcode尽量随机散列分布。
DateTime 如何存储时间?
答:DateTime结果内部存储一个64位长的整数,其中的低62位用来代表时间,它表示从0001年1月1日0时0分0秒开始到表示的时间经过百毫微秒数。
如何在DateTime对象和字符串对象之间进行转换
答:DateTime可通过ToString方法来格式化输出到字符串,而相反地,TryParse和Parse方法则从一个字符串中得到信息并构造一个DateTime对象。
什么是UTC时间,如何转换到UTC时间?
答:UTC是格林尼治标准时间(GMT),它是0度经度测量到的时间。通过ToUniversalTime和ToLocalTime方法可以在本地时间和UTC时间之间进行转换。两个方法在转换时会相应地设置保存时间的64位整数的高两位标志,并且转换的算法考虑了夏令时。
IFormattable 和 IFormatProvider的使用
答:IFormattable 接口帮助实现了多样式的格式化输出。IFormattable得到ToString方法接受一个代表格式的字符串参数,通过对这个参数的分析来进行格式化输出。另外,ng方法接受一个IFormatProvider类型的参数,以允许类型的使用者提供格式化的方法。
如何告诉类型格式化输出的方式
答:IFormatProvider让类型的使用者有机会提供格式化的方法。GetFormat方法返回一个格式化器,在通常情况下,该格式化器的类型是一个实现了ICustomFormatter的类型对象。IFormatProvider接口和IFormattable接口一起可以实现灵活强大的格式化输出。
如何操作文件和文件夹
答:.Net内建类型中提供了FileInfo和DirectoryInfo 两个类型,分别用于操作文件和文件夹。有别于File和Directory类型,FileInfo和DirectoryInfo主要的功能在于操作文件夹和文件夹在文件系统中的结构,完成诸如创建、复制、读取信息、移动、判断是否存在、删除等功能。
如何实现文件和文件夹的监控功能
答:.Net提高了FileSystemWatcher类型来实现文件系统的监控。程序员通过设置监控目录,监控类型和回调方法,就可以方便地实现监控功能。但需要小心FileSystemWatcher缓存溢出的情况。
.Net提供了哪几个定时器类型? (和线程同步,多线程编程有关)
答:内建类型提供了三个定时器类型,分别是:
,
用户窗体设计,并且运行在窗体线程之中,这导致了其计时不准确和遗漏节拍的特点;ingTimer类型的每个计时回调都在一个工作线程上执行,其计时相对准确,可以视为的一个包装,其类型设计相对古老,笔者不建议读者使用该定时器。
.Net的内建定时器类型是否会发生回调方法重入?
答:在.net的内建定时器中,和两个类型可能发生回调方法重入的问题,而则不存在这个问题。
在定时器设计时,需要考虑是否需要为回调方法加锁和如何加锁,原则上被加锁的代码越少,则对效率的影响也越小。
面试真题:
(myString);这行代码有什么问题?使用TryParse方法避免异常。
,==,ReferenceEquals 如何区别使用?
3.简述DateTime和长整型的转换算法。DateTime本身使用长整型存储时间。
时间和本地时间如何转换?
hCode方法有何作用?什么时候会用到该方法?
提供了哪几种定时器?各自的定时原理是什么?
设计小组为什么要设计这个类型?
8.谈一谈格式化输出的常用场合。
请解释委托的基本原理
答:委托是一类继承自te的类型,每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,有可以是静态方法。委托实现了回调方法的机制,能够帮助程序员设计更加简洁优美的面向对象程序。
委托回调静态方法和实例方法有何区别?
答:当委托绑定静态方法时,内部的对象成员变量_target将会被设置成null,而当委托绑定实例方法时,_target会被设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。
什么是链式委托?
答:链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。
链式委托的执行顺序是这么样的?
答:链式委托的执行顺序是:按照委托链上的顺序从当前委托开始依次往后执行。如果有需要,可以通过GetInvocationList()方法来获得委托链上所有需要执行的委托,并且按照任何希望的顺序去执行它们。
可否定义拥有返回值的方法的委托链
答:委托可以是带有返回值的方法,但多于一个带返回值的方法被添加到委托链中时,程序员需要手动地调用委托链上的每个方法,否则委托使用者只能得到委托链上最有一个被执行方法的返回值。
委托通常可以应用在那些场合
答:委托的应用场合通常是任务的执行者把细节工作进行再分配,执行者确切地知道什么工作将要被执行,但却把执行细节委托给其他组件、方法或程序集。
请解释事件的基本使用方法
答:事件是一种使对象或类能够提供通知的成员。客户端可以通过提供事件处理程序为相应的事件添加可执行代码。事件是一种特殊的委托。
事件和委托有何联系
答:事件是一个委托类型,该委托类型的方法无返回值,并且拥有两个参数,object与TEventArg。事件的订阅和取消都是基于委托链表来实现的。
如何设计一个带有很多事件的类型
答:当某个类型包含较多的事件时,可以考虑集中把所有事件的委托链表存储在一个集合之中,这样能做到有效地减少对象的大小,因为在实际逻辑世界中一个对象使用所有事件的概率相对很低,.NET 的内建类型andlerList提供了这样一个存储事件集合的封装。
用代码表示如下情景:猫叫,老鼠逃跑,主人惊醒
答:在模拟实际场景的面试题中,使用事件进行设计往往能达到简单并且贴近场景的效果。笔者鼓励读者在理解事件的前提下,在设计中多尝试使用事件机制。
请解释反射的基本原理和其实现的基石
答:反射是一种动态分析程序集、模块、类型、字段等目标对象的机制,它的实现依托于元数据,元数据是存储在PE文件中的数据块,它详细记录了程序集或模块内部的结构、引用类型、程序集和清单。
.Net提供了哪些类型来实现反射
答:在tion命令空间下,net提供了丰富的实现反射机制的类型,可以达到读取元数据中所有信息并且动态创建类型对象的功能。详细的类型列表和使用方法请参考本节的分析问题。
反射的一些问题。
特性。
真题:
1.什么是反射?
2.在什么情况下使用过委托?
3。请概述一下事件和委托有什么不同?
4.你最常用的特性有哪些?
5.请介绍一个你设计过的自定义特性,为什么要使用特性?
6.反射机制的吸能如何?你会在什么情况下考虑使用反射?
7.请问动态地反射代码有何作用?
8.请使用代码描述kfc排队购买的场景
9.请介绍程序集的元数据中包含哪些内容。
.net高级特性:委托,事件,反射和特性。
.NET 多线程编程
请解释操作系统层面上的线程和进程
答:简单地来说,进程代表了一个正在运行的应用程序的实体,而一个进程中可包含1个或多个线程。
多线程程序在操作系统里是并行执行的吗?
答:在单cpu的计算机架构上,任何时候只可能存在一个运行的线程,操作系统通过快速地调度轮换使使用者感觉到多线程在同时执行。而在多cpu的架构上,则可能存在完全并行运行的线程,这取决于线程之间是否争用来其他的资源。
什么是纤程?
答:纤程是微软公司提出的轻量级线程的概念,一个纤程拥有自己的栈和寄存器状态。一个线程可以包含多个纤程,和线程由操作系统调度有所不同的是,线程内纤程的调度完全由程序员自己控制,操作系统的内核完全不会知道纤程的存在。在net架构中,线程的概念不一定和操作系统的线程对应,在有些情况下net中的线程对应一个纤程。
.Net中的多线程编程
答:.NET提供了类型封装了线程的操作,通过该类型,程序员可以手动地创建、查询、控制以及结束线程。
如何使用.NET的线程池
答:Pool类型封装了线程池的操作。每个进程都拥有一个线程池,.NET提供了线程池管理的机制,用户只需要把线程需求插入到线程池中,而不必理论后续的工作。所有线程池中的线程都是后台线程,它们不会阻碍程序的退出。
如何查看和设置线程池的上下限
答:ool 类型提供了查看和修改线程池上下限值的方法,在net2.0后,默认的线程池上限已经被修改得足够大而可以满足绝大部分系统的需求。在实际应用中,程序员应该避免无意义地修改线程池的阀值。
如何定义线程独享的全局数据(TLS)
答:线程本地存储是一种提供了线程独享的全局数据功能的机制。在NET中,可以使用Thread类型的SetData和GetData来操作TLS数据,同时NET提供了名为ThreadStatic的特
性来申明线程独享的数据。
如何使用异步模式读取一个文件(异步编程模式)
答:调用FileStream和BeginRead和EndRead方法可以实现异步读取文件。
如何阻止线程执行上下文的传递
答:线程的执行上下文是所有线程上下文的一个包装,在通常情况下,当前线程的执行上下文会自动地流入到新建的线程之中。程序员可以使用定义在pool类型中的UnsafeQueueUserWorkItem方法和定义在ExecutionContext类型中的SuppressFlow方法来阻止这样的流动。
多线程程序的线程同步
答:同步块是指net维护的同步块数组中的某个元素,负责提供线程同步的操作,当某个线程拥有了某个同步块时,其他线程就在试图访问该同步块时进入等待状态。同步索引是每个堆内对象都会分配的一个字段。
C#中的lock关键字有何作用?
答:C#中的lock关键字实质是调用和两个方法的简化语法,功能上其实现了进入和退出某个对象的同步。在通常情况下,可以通过lock一个私有的引用成员变量来完成成员方法内的线程同步,而通过lock一个私有的静态引用成员变量来完成静态方法内的线程同步。
可否使用值类型对象来实现线程同步
答:值类型的对象分配在堆栈上,没有同步索引字段,所以不能用来进行同步。即使使用了装箱机制,也会导致同步失败。对值类型使用lock关键字将导致一个编译错误,而对值类型使用 和方法,将导致一个运行时的错误。
可否对引用类型对象自身进行同步
什么是互斥体,Mutext类型和Monitor类型的功能有何区别?
面试真题:
1.进程和线程分别怎么理解?
考虑进程和线程的关系。
2.根据线程安全的相关知识,分析一下代码,当调用test方法时,i》10是否会引起死锁?并简要说明理由。
Public void test(int i)
{
Lock(this)
{
If(i>10)
{
i--;test(i);
}
}
}
注意值类型的参数传递方式。
3.后台线程和一般线程有何区别?
4.一共有几种方法定义在多线程间共享的数据?
5.使用lock使用和使用Mutex有何区别?
6.可否对值类型使用lock?
7.你在什么时候会考虑使用多线程技术?
8.使用Thread类型新建的线程是否来自与线程池?
应用开发
请解释以什么形式运行?
答:是作为一个ISAPI过滤器程序来运行的,同时它是一个NET CLR的宿主,从而实现了运行托管的服务器代码的功能。
常见HTTPcode有哪些?
答:200 请求结束
204服务器端实现了请求,但没有返回新的信息
401 访问就拒绝,无访问权限
404请求资源没有找到
500服务器端出错
HTTP code 是HTTP协议中服务器返回给请求端的一个状态码。
GET请求和POST请求有何区别?
答:HTTP协议中有两种常用的请求:GET和POST。GET请求把表单的数据显式地放在URL中,并且对长度和数据编码有所限制。POST请求把表单数据放在HTTP请求体中,并且没有长度的限制。
介绍的页面生存周期
答:页面的生存周期包含了PreInit,Init,InitComplete,LoadState,ProcessPostData,PreLoad,Load,PorcessPostData,ChangedEvents,PostBackEvent,LaodComplete,PreRender,PreRenderComplete,SaveState,SaveStateComplete,Render,Unload 这些步骤
1.初始化 PreInt,Init,InitComplete
包括初始化类对象,初始化主题页面等特性,判断是否是第一次访问页面等。
2.加载数据和页面 LoadState,ProcessPostData,ProLoad,Load,ProcessPostData。
程序员通常在Onload中编写页面初始化代码,最后会再次执行ProcessPostData,以处理load时候新添加的数据。
3.触发事件 ChangedEvents, PostBackEvent
比较viewSate数据和上一次回传的数据,觉得那些事件要出发,然后逐一触发。
4.保存状态并呈现页面 SaveState,SaveStateComplete,Render。首先页面会把编码保存所有的ViewState数据,然后将其嵌入到页面的一个隐藏控件中,接着转换所有控件标签并生成页面HTML,并且发送回客户端。
控件和页面
什么是静态页面,什么是动态页面?
答:静态页面是指不需要服务器代码额外处理,直接可以呈现给使用者的页面,常见的静态页面是html。相对的,需要服务器代码针对每个请求做处理的页面称为动态页面,ASP。Net中常见的动态页面是aspx。
请简述ViewState的功能和实现机制
答:ViewState用来存储页面范围内的数据,以保证用户在离开页面之前数据的持续性。实现上来说,ViewState被保存在页面内的一个隐藏控件内,并且提交到服务器后被提取使用。
Session有哪几种存储方式,之间有何区别,如何进行设置?
答:Session有四种存储方式,分别为存储在IIS进程中、状态服务器中、SQL Server数据库中和自定义程序中。除了准备必要的服务外(如SQL Server数据库服务器),还需要配置站点的文件进行设置。
如何嵌套使用GridView控件
答:GridView和其前身DataGrid一样,都支持模板列。程序员可以自定义模板列内的控件和排版样式,只要在一个模板列内再放入一个GridView控件,就可以实现Gridviewd的嵌套使用。
列举几种实现页面跳转的方法,并说明其实现机制
答:常用的跳转技术包括:ct,er,e,使用脚本进行跳转和直接使用超链接。
ct:迫使客户端跳转到指定的页面,最终跳转的仍是客户端,服务端无法保证。并不直接,需要一个额外的从客户端到服务器端的来回才能完成跳转操作。目标页面不受限制,可以实现从这个站点跳转到另一个服务器上另一个站点的功能。
er 。当前页面马上停止,直接进入新的页面并进行加载。与Redicret相比,不仅少了一个客户端到服务器端的往返,并且只能跳转到同一个站点的页面。
e:不是页面的跳转功能,而是页面的呼叫功能。
使用脚本,javascript。
(url)
使用超链接进行跳转
请解释<%#Eval(“sourec”)%>的功能和实现机制
答:Eval表达式实现了数据绑定的功能,在ASPNet2.0之后其表达式书写更加简洁,并且性能也没有下降。从实现上来说,类似<%#Eval(“source”)%>这样的表达式,通过从绑定数据栈顶端取得需要的绑定数据项,并进行数据绑定。
ObjectDataSource控件有何作用
答:ObjectDataSource扮演了双向数据绑定中传递元素的角色,在分层BS系统中通常作为业务逻辑层和页面显示层的中间衔接。关于ObjectDataSource的使用方法和功能。
如何使用正则表达式来验证一个上海市电话号码
答:为 021-d{8}$.在应用程序中有很多方法使用正则表达式来验证一个字符串。
介绍验证控件的功能和使用方法
答:验证是应用程序中经常遇到的一个请求。一共提供了6种和验证相关的控件,分别是:CompareValidator、CustomValidator,RangeValidator,RegularExpression
Validator,CustomValidator, ValidationSummary。
如何防止SQL注入攻击?
答:SQL注入式攻击是常见的一种攻击方法,主要利用的是系统设计的弊端。程序员在设计时需要考虑到注入式攻击的问题,避免直接使用用户输入拼接SQL语句,适当使用加密数据进行存储,并且在适当的场合使用存储过程。
面试真题
6相对与IIS5有什么改变?而II7相对于II6有什么改变?参考微软产品文档。
403代表什么含义?
3.两个不同的客户端访问一个站点,是否是同一个对象处理这两个请求?
了解的运行机制。
4.请解释什么是多层架构?什么是MVC?考察应聘者的网站架构经验。
5.公共网站经常受到哪些类型的攻击?
需要应聘者有较为丰富的网站支持经验。
n丢失的原因有哪些?需要了解session的运行机制。
和Session的实现原理是什么?
n有哪几种存储方法?你如何取舍?需要针对不同的系统需求进行分析。
9.你在什么情况下会考虑自定义控件? 考察应聘者的设计经验。
NET中的数据库开发
什么是关系型数据库?
答:关系型数据库是支持采用了关系模型的数据库,简单来收,关系模型就是指二维表模型。相对其他模型来说,关系型数据库具有理解更容易、使用更方便、维护更简单等优点。
关系型数据库的一些基本概念:
关系:理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名。
元组:可以理解为二维表的一行,在数据库中被称为记录。
属性:理解为二维表的一列,在数据库中被称为字段。
域:属性的取值范围,就是数据库中某一列的取值限制。
关键字:一组可以唯一标识元组的属性。数据库中常称为主键,由一个或多个列组成。
关系模式:指对关系的描述,其格式为:关系名(属性1,属性2,…属性N)。在数据库中通常称为表结构。
如何通过SQL语句来实现行列转换?
答:行列转换的SQL命令通常需要依靠动态的SQL语句。
SQL语言基础:
Create ,alter,drop,grant,revoke,commit,rollback,insert,undate,delete,select
Create 创建一个表,并且同时设置表名字和表结构。
CREATE TABELE


发布评论