1, system.string是值类型还是引用类型
字符串对象一旦被初始化后,就不能再进行任何包括删除,切断,插入改动,它是一个只读的对象,我们所看到的字符串任意修改的假象,实际上初始化了一个新的字符串对象并且对其赋值.
由于字符串的只读特性,任何对字符串对象的修改都将强制生成一个新的字符串对象.理解这一点相当重要,读者在编写代码时,应该尽量避免过多务必要的生成字符串的中间变量对象.
2 , stringbuilder类型有何作用
string的性能问题产生于其内容不可修改的特性,更加常见的情况是,一个字符串对象的最终生成需要经过一个组装的过程,而在这个组装过程中必将生产很多的临时字符串对象,这些对象在堆上分配,需要垃圾回收器来回收,这些动作都会对程序的性能产生巨大的影响.这就产生了对stringbuilder的需求,stringbuilder的设计思想源于构造器的设计模式.构造器设计模式致力于解决复杂的构造问题,而对于字符串对象,正需要这样的构造器来进行组装.stringbuilder类型在最终生成string对象之前,将不会产生任何的string对象.这就很好的解决了性能的问题.
3, SecureString的实例如何被分配和释放
System.SecureString被设计用来保存一些机密的字符串,完成传统字符串所不能做到的工作.传统字符串以明码的形式分配在内存上,一个简单的内存读写软件可以轻易的捕获这些字符串,这在有些机密的系统中是不被允许的.
为了保证它的安全性,SecureString的分配不同于传统的字符串,它是被分配在非托管内存上的,并且它是从一开始就以加密的形式存在的,对它的所有操作,无论是添加,删除,插入等,都是逐字符进行的.
SecureString实现了标准的Dispose/Finalize模式,这是因为其对象的分配是在非托管内存上,所以需要保证每个对象在作用域退出后将被释放掉.在释放前会被全部置0.
4, 什么是字符串池机制
由于字符串的不可变性,程序中的同一字符串的大量修改或者对多个引用赋值同一字符串理论上会产生大量的临时字符串对象.这回极大的降低程序的性能.对于前者,可以使用stringbuilder解决,而对于后者.NET提供了另外一种不透明的机子来帮助优化性能.这就是字符串池机制.
当一个新的字符串对象需要分配时,CLR首先检测内部容器中是否已经包含了该字符串对象,如果已经包含,则直接返回已经存在的字符串对象引用,如果不存在,则新分配一个字符串对象.同事把其添加到内部容器里去.但是当程序用new关键字显式的声明新分配一个字符串对象时,该机制将不会起作用(string d=new string(chars);)
5, 解释泛型的基本原理
泛型类似于C++的模板,允许程序员定义更通用的类型和双发,并且在具体使用时候再生成具体的封闭类型.
6, 什么是泛型的约束
当一个泛型参数没有任何约束时,它可以进行的操作和运算是非常有限的.因为不能对实参做任何类型上的保证,这时候就需要用到泛型的约束.
T:struct 类型参数必须是值类型
T:class 类型参数必须是引用类型
T:new() 必须具有无参的构造函数
T:基类名: 类型参数必须是指定的基类或派生自指定的基类
T:<接口名称>: 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
T:U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。
7 , .NET提供了哪几种可进行序列化操作的类型
提供了三个可执行序列化和反序列化的类型,BinaryFormmatter,soapformatter,xmlserializer.
BinaryFormmater用于将可序列化的对象序列成二进制的字节流.而SoapFormatter则致力于把可蓄力阿华的类型序列化成符合Soap标准的XML文档.
而XmlSerializer并不针对那些写了Serialization特性的对象.取而代之的是XmlIgnore属性.而XmlSerializaer必须显示的拥有一个无参的构造函数.而它也只能序列化公共成员变量
8, 什么是委托
委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法.
9 , 委托调用静态方法和实例方法时有何区别
当委托调用静态方法时,内部成员变量_target会被设置为null,而当委托绑定实例方法时,_target会被指向该实例对象.
10, 什么是事件
事件是一个委托类型,该委托类型的方法无返回值,并且拥有两个参数,object,TEventArg,事件的订阅和取消都是基于委托链表来实现的.
11, 如何设计一个带有很多类型的事件
当某个类型包含很多事件的时候,可以考虑集中把所有事件的委托链表存储在一个集合中,这样能有效的减少对象的大小,EventHandlerList提供了这样一个存储事件集合的封装.
12, 反射的基本原理
反射是一种动态分析程序集,模块,类型,字段等目标对象的机制,它的实现依托于元数据.
13, .NET提供了哪些类型来实现反射
Assembly,EventInfo,FieldInfo,MemberInfo,Module
14, ViewState的功能和实现机制
ViewState用来存储页面范围内的数据,以保证在离开页面之前数据的持续性.
15, Session有哪几种存储方式,之间有何区别,如何进行设置
保存在IIS进程上,保存在状态服务器上,保存在sql server中,自定义保存程序.
16 , XML的优点
内容与结构分离,规范统一,支持多种编码格式,XML已经被应用在数据交换,web service,电子商务,配置文件等多个领域之中.
17 , .NET中操作XML的基本类型有哪些
XML读写类型和DOM类型
18 , XML读写类型有哪些
读取类型:XmlReader 写入类型:XmlWriter.
19 , DOM类型操作
使用XmlDocument类型可以自由地操作文档中的节点和属性.
20 , 什么是XPATH
它是一种用来确定XML文档中某部分位置的语言 , 在.NET中,XmlDocument的SelectSingleNode和SelectNodes方法就是根据XPATH字符串来查找节点的.
21 , 在.NET中如何验证一个XML文档的格式
XSD已经成为了最标准和通用的XML结构定义语言.在.NET中.XmsReader支持使用XSD文件来验证XML文档是否符合特定的格式,然后设置包含了置顶XSD文件的XmlReaderSetting对象,并且遍历XML文档.
22, 简述SOAP协议
SOAP致力于以XML形式提供一个简单清凉的用于在分散或分布环境中交换结构化和类型信息的机制.SOAP是一种跨技术平台的协议,
23, 什么是WSDL
WSDL的全称是WEBSERVICE描述语言.用来描述提供的方法名称,参数数量,哥哥参数的类型以及返回的类型等信息.
24, webservice的异常机制
一个SOAP消息中只能存在一个fault节点来包含错误消息.在.NET框架中,抛出的异常夺回被不做并且转入一个SoapException对象中,此对象被放入fault节点并且传输回客户端.
-----------------------------第二部分------------------------------------
1 , .NET中的引用类型共有四种:类,接口,数组,委托。
2 , 可以使用Tuple对象作为方法的形参或者返回值。
3 , new关键字:子类会隐藏父类的同名方法,并提供自己的新版本(子类与父类重名时)。
4, ,如果子类与父类方法同名的情况下,会有new关键字重写,与虚方法重写两个方法。(抽象和接口除外)
5, 如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。
6 ,“接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。
7 ,尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一个公共方法。
8 ,如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
9 , 如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
10 , 如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。
11 , 类的构造函数与类名相同,没有返回值,可以重载,没有参数的为默认构造函数,一般用于初始化类的字段。
12, , 把一个类的构造函数设置为private,则不可以使用new关键字来创建这个类的对象。
13 ,委托可以看成是一种数据类型,可以用于定义变量。每一个委托都确定了一个方法的签名。
14 , 委托变量不仅可以引用一个方法,还可以组合多个方法并批量执行它们。称作:多路委托变量。
15 , 一个多路委托变量可以引用多个方法,执行一个多路委托变量,执行一个多路委托变量,会导致它所包含的所有方法被顺序的执行。
16 , 委托一旦创建之后,它的委托调用列表时不可改的,所以内容是只读的。
17 , Func系列委托用于引用一个有返回值的方法。
18 , 在以下情况请使用委托:
1, 使用事件时。
2, 当调用方不需要访问实现该方法中的其他属性,方法或接口时。
3, 需要组合方法。
19 , 如果委托只在一个地方调用,那么就可以省去方法名,使用匿名方法。