1.Stringstr=newString("a")和Stringstr="a"有什么区别?
Stringstr="a";这个只是一个引用,内存中如果有“a"的话,str就指向它,如果没有才创建如后还用到"a"这个字符串的话并且是这样用:Stringstr1="a";Stringstr2="a";Stringstr2="a";这4个变量都共享一个字符串"a"而Stringstr=newString("a");是根据"a"这个String对象再次构造一个String对象,将新构造出来的String对象的引用赋给str
2.判断字符串变量str是否为空的一下三种方法哪个性能更优
a、str=="";b、str==String.Empty;c、str.Length==0;?答案是c;
3.string与String的区别
string、int是C#定义的类型,而String、Int32是.net类型即是CTS类型;string是.NET框架中System.String的别名。string在编译的时候会转化为String类
4.虚方法(virtual)和抽象方法(abstract)的区别?
5.子类对父类中虚方法的处理有重写(override)和覆盖(new),请说明它们的区别?
有父类ParentClass和子类ChildClass、以及父类的虚方法VirtualMethod。有如下程序段:ParentClasspc=newChildClass();pc.VirtualMethod(...);如果子类是重写(override)父类的VirtualMethod,则上面的第二行语句将调用子类的该方法如果子类是覆盖(new)父类的VirtualMethod,则上面的第二行语句将调用父类的该方法
6.抽象类(abstract)和接口(interface)的区别
7.填空:
Connection,Command,DataReader,DataAdapter,DataSet
connection连接对象command命令对象,指示要执行的命令和存储过程!datareader是一个向前的只读的数据流。dataadapter是功能强大的适陪器,支持增删改查的功能dataset是一个数据级对象,相当与内存中的一张表或多张表
8.不定项选择:
(1)以下叙述正确的是:BC
A.接口中可以有虚方法。B.一个类可以实现多个接口。
C.接口不能被实例化。D.接口中可以包含已实现的方法。(2)从数据库读取记录,你可能用到的方法有:BCD
A.ExecuteNonQueryB.ExecuteScalarC.FillD.ExecuteReader9.简述private、protected、public、internal修饰符的访问权限。
B.Protected关键字是一个成员访问修饰符。受保护成员在它的类中可访问并且可由派生类访问。有关protected与其他访问修饰符的比较,请参见可访问性级别,只有在通过派生类类型发生访问时,基类的受保护成员在派生类中才是可访问的
C.Internal关键字是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的
DProtectedInternal它可以看作是Protected与Internal的并集,意思是:如果是继承关系,无论在不在同一程序集里都能访问;如果不是继承关系,那么只能在同一程序集内访问。
E.Public具有最高级别的访问权限,对访问成员没有限制。
10.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID
可能不是连续的。)11.列举ASP.NET页面之间传递值的几种方式。
QueryString,Session和Server.Transfer12.写出程序的输出结果classClass1{
privatestringstr="Class1.str";
privateinti=0;
staticvoidStringConvert(stringstr){
str="stringbeingconverted.";
}
staticvoidStringConvert(Class1c){
c.str="stringbeingconverted.";
staticvoidAdd(inti){
i++;
staticvoidAddWithRef(refinti){
staticvoidMain(){
inti1=10;
inti2=20;
stringstr="str";
Class1c=newClass1();
Add(i1);
AddWithRef(refi2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
13.写出程序的输出结果
publicabstractclassA
{
publicA()
Console.WriteLine('A');
publicvirtualvoidFun()
Console.WriteLine("A.Fun()");
publicclassB:A
publicB()
Console.WriteLine('B');
publicnewvoidFun()
Console.WriteLine("B.Fun()");
publicstaticvoidMain()
Aa=newB();
a.Fun();
}14.写出程序的输出结果:
publicclassA
publicvirtualvoidFun1(inti)
Console.WriteLine(i);
publicvoidFun2(Aa)
a.Fun1(1);
Fun1(5);
publicoverridevoidFun1(inti)
base.Fun1(i+1);
Bb=newB();
Aa=newA();
a.Fun2(b);
b.Fun2(a);
15.一列数的规则如下:1、1、2、3、5、8、13、21、34......求第30位数是多少,用递归算法实现。
16.程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
要求:1.要有联动性,老鼠和主人的行为是被动的。2.考虑可扩展性,猫的叫声可能引起其他联动效应。
参考答案
1.(1)继承性、封装性、多态性。(2)IEnumerable、GetEnumerator(3)对ADO.net的了解2.(1)B、C(考对接口的理解)(2)B、C、D(考查对ADO.net的熟练程度)3.private:私有成员,在类的内部才可以访问。protected:保护成员,该类内部和继承类中可以访问。public:公共成员,完全公开,没有访问限制。internal:在同一命名空间内可以访问。4.解1:selecttop10*fromAwhereidnotin(selecttop30idfromA)解2:selecttop10*fromAwhereid>(selectmax(id)from(selecttop30idfromA)asA)
5.1.使用QueryString,如....id=1;response.Redirect()2.使用Session变量3.使用Server.Transfer
6.(考查值引用和对象引用)
10
21
0
Str
stringbeingconverted.
7.AB
A.Fun()
(考查在继承类中构造函数,以及new方法,)
18.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.19.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函
数的执行过程.请附code
构造先父后子,析够反之
publicclassTestB
publicTestB()
Console.Write("begincreateBobject"r"n");
~TestB()
Console.Write("begindestoryBobject"r"n");
publicclassTestA:TestB
publicTestA()
Console.Write("begincreateAobject"r"n");
~TestA()
Console.Write("begindestoryAobject"r"n");
21..Net中读写数据库需要用到哪些类?他们的作用
sqlconnection连接数据库,sqlcommand执行T-SQL语句,或存储过程22.ASP.net的身份验证方式有哪些?分别是什么原理?
23.解释一下UDDI、WSDL的意义及其作用。
UDDI(UniversalDescription,DiscoveryandIntegration)统一描述、发现和集成协议,是为解决Web服务的发布和发现问题而制订的新一代基于Internet的电子商务技术标准。它包含一组基于Web的、分布式的Web服务信息注册中心的实现标准,以及一组使企业能将自己提供的Web服务注册到该中心的实现标准。
UDDI利用SOAP消息来查找和注册Web服务。并为应用程序提供了一系列接口来访问注册中心。
24.常用的调用webservice方法有哪些?三种
利用webservice.htc调用WebService方法
在Internet上调用WebService方法25.讲一讲你理解的webservice,在dotnetframework中,怎么很好的结合xml(讲概念就行了)
26.C#可否对内存进行直接的操作?(这可是个难点哦?要注意!),如果能,如何操作;如果不能,为什么
可以,用指针来操作27.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
C#通过提供索引器,可以象处理数组一样处理对象。特别是属性,每一个元素都以一个get或set方法暴露。索引器不单能索引数字(数组下标),还能索引一些HASHMAP的字符串,所以,通常来说,C#中类的索引器通常只有一个,就是THIS,但也可以有无数个,只要你的参数列表不同就可以了索引器和返回值无关,索引器最大的好处是使代码看上去更自然,更符合实际的思考模式.
28.面向对象的思想主要包括什么?
封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。继承:子类拥有父类的所有数据和操作。
多态:一个程序中同名的不同方法共存的情况。有两种形式的多态–重载与重写。
29.什么是ASP.net中的用户控件
有时可能需要控件中具有内置ASP.NETWeb服务器控件未提供的功能。在这种情况下,您可以创建自己的控件。有两个选择。您可以创建:用户控件。用户控件是能够在其中放置标记和Web服务器控件的容器。然后,可以将用户控件作为一个单元对待,为其定义属性和方法。
ASP.NETWeb用户控件与完整的ASP.NET网页(.aspx文件)相似,同时具有用户界面页和代码。可以采取与创建ASP.NET页相似的方式创建用户控件,然后向其中添加所需的标记和子控件。用户控件可以像页面一样包含对其内容进行操作(包括执行数据绑定等任务)的代码。
用户控件与ASP.NET网页有以下区别:
用户控件的文件扩展名为.ascx。
用户控件不能作为独立文件运行。而必须像处理任何控件一样,将它们添加到ASP.NET页中。
用户控件中没有html、body或form元素。这些元素必须位于宿主页中。
创建用户控件要比创建自定义控件方便很多,因为可以重用现有的控件。用户控件使创建具有复杂用户界面元素的控件极为方便。
30.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?
CTS、CLS和CLR分别作何解释?
31.列举一下你所了解的XML技术及其应用
可扩展标记语言XML(eXtensibleMarkupLanguage)[1]是一种简单灵活的文本格式的可扩展标记语言,起源于SGML(StandardGeneralizedMarkupLanguage),是SGML的一个子集合,也就是SGML的一个简化版本,非常适合于在Web上或者其它多种数据源间进行数据的交换.
32.值类型和引用类型的区别?写出C#的样例代码。
33.ADO.net中常用的对象有哪些?分别描述一下。
Connection数据库连接对象Command数据库命令DataReader数据读取器DataSet数据集
34.如何理解委托?
委托类似于C++函数指针,但它是类型安全的。委托允许将方法作为参数进行传递。委托可用于定义回调方法。委托可以链接在一起;例如,可以对一个事件调用多个方法。方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。C#2.0版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。
35.C#中的接口和类有什么异同。
异:不能直接实例化接口。接口不包含方法的实现。接口、类和结构可从多个接口继承。但是C#只支持单继承:类只能从一个基类继承实现。类定义可在不同的源文件之间进行拆分。
同:接口、类和结构可从多个接口继承。接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。接口可以包含事件、索引器、方法和属性。一个类可以实现多个接口。
37.UDP连接和TCP连接的异同。
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
39.进程和线程分别怎么理解?
40.什么是code-Behind技术。
就是代码隐藏,在ASP.NET中通过ASPX页面指向CS文件的方法实现显示逻辑和处理逻辑的分离,这样有助于web应用程序的创建。比如分工,美工和编程的可以个干各的,不用再像以前asp那样都代码和html代码混在一起,难以维护。
41..net中读写XML的类都归属于哪些命名空间?
System.XML类
42.什么是SOAP有哪些应用。
SOAP(SimpleObjectAccessProtocol)简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。
SOAP是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。SOAP利用XML技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。SOAP定义了一种方法以便将XML消息从A点传送到B点。为此,它提供了一种基于XML且具有以下特性的消息处理框架:1)可扩展,2)可通过多种底层网络协议使用,3)独立于编程模型。
43.如何理解.net中的垃圾回收机制。
44.什么是WEB控件?使用WEB控件有那些优势?
运行在服务器端的控件,只要将HTML控件加上runat=server.45.请谈谈对正则表达式的看法?
正则表达式是一种处理文本的有用工具。无论是验证用户输入、搜索字符串内的模式、还是以各种有效方式重新设置文本格式,正则表达式都非常有用。
46.WEB控件可以激法服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么
要使用自动传回。
在web控件发生事件时,客户端采用提交的形式将数据交回服务端,服务端先调用Page_Load事件,然后根据传回的状态信息自动调用服务端事件自动传回是当我们在点击客户端控件时,采用提交表单的形式将数据直接传回到务端只有通过自动传回才能实现服务端事件的机制,如果没有自动回传机制就只能调用客户端事件,而不能调用服务端事件
47.WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
可以调用,例如:
48.请解释web.config文件中的重要节点
49.请解释ASP.NET中的web页面与其隐藏类之间的关系?
50.什么是viewstate,能否禁用?是否所用控件都可以禁用
Viewstate是保存状态的一种机制,EnableViewState属性设置为false即可禁用
ViewState是由ASP.NET页面框架管理的一个隐藏的窗体字段。当ASP.NET执行某个页面时,该页面上的ViewState值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性(即
很有可能是在Page_Load中数据处理时没有进行Page的IsPostBack属性判断52.请解释一个WEB页面中代码执行次序。
Init,Load,PreRender事件执行顺序:
1)控件的Init事件
2)控件所在页面的Init事件
3)控件所在页面的Load事件
4)控件的Load事件
5)控件所在页面的PreRender事件
6)控件的PreRender事件
规律:
1)Init事件从最里面的控件(包括用户控件及普通控件)向最外面的控件(页面)引发,Load及PreRender等其他事件从最外面的控件向最里面的控件引发;
2)控件之间相同事件的执行顺序依控件在页面的位置按从左到右,从上到下的先后顺序执行。
注意:
1)切记用户控件也被视为页面中的一个控件;
2)把用户控件作为单独的一个特殊页面来看,它本身及其所包含的控件同样遵守相同的规律;
3)有时在客户端程序(如javascript)中会用到客户端body对像的onload事件,注意这个客户端事件是最后执行,即在服务器端所有事件执行完后才执行.53.请解释什么是上下文对象,在什么情况下要使用上下文对象
上下文对象是指HttpContext类的Current属性,当我们在一个普通类中要访问内置对象(Response,Request,Session,Server,Appliction等)时就要以使用此对象
54.请解释转发与跳转的区别?
转发就是服务端的跳转A页面提交数据到B页面,B页面进行处理然后从服务端跳转到其它页面跳转就是指客户端的跳转
55.请解释ASP.NET中不同页面之间数据传递有那些方式?
session(viewstate)简单,但易丢失,application全局,cookie简单,但可能不支持,可能被伪造inputttype="hidden"简单,可能被伪造,url参数简单,显示于地址栏,长度有限,数据库稳定,安全,但性能相对弱
56.请解释ASP.NET中buttonlinkbuttonimagebutton及hyperlink这四个控件之间的功别
1.Button和ImageButton用于将数据传递回服务器.
2.Hyperlink用于在页面之间导航
3.LinkButton用于将数据保存到服务器或访问服务器上的数据
4.LinkButton控件具有与HyperLink控件相同的外观,不过却具有与Button控件相同的功能
57.请解释一下.NET多层应用程序中层与层之间以那几种方式进行数据传递。并解释你自己的项目中采用那
种方式进行。
自定义类结构传数据58.如果需要在GridView控件中的某一列中添加下拉列表框并绑定数据怎么解决?
后台的Rowdatabound事件可以进行绑定,比如这样
if(数据行)
DropDownListddl=(DropDownList)e.row.FindControl("DropDownListID");
ddl.datasource=数据源;(假定你已经设置了key和value绑定字段)
ddl.databind();
}59.请解释asp.net中的数据绑定与传统数据绑定有什么区别?
传统的数据绑定是一种“连接数据绑定”,即在数据绑定期间,客户端一直保持与数据库的连接,这种状态下,数据库的性能大受影响。asp.net的数据绑定是一种“非连接数据绑定”,即只在读取和更新数据的瞬间,才与数据库连接并交换数据,之后便可释放与数据库的连接,数据库的性能因此将大大提高。
60.请解释接口的显式实现有什么意义?
1、因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员执行体就可以起到作用。
2、显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。
61.您在什么情况下会用到虚方法?它与接口有什么不同?
当在继承类中想重写某一方法时会用到虚方法;虚方法是类的成员函数,接口相当于抽象类62.Override与重载有什么区别?
重载是提供了一种机制,相同函数名通过不同的返回值类型以及参数来表来区分的机制
override是用于重写基类的虚方法,这样在派生类中提供一个新的方法
覆写(Override)的两个函数的函数特征相同,重载(Overload)的两个函数的函数名虽然相同,但函数特征不同。
函数特征包括函数名,参数的类型和个数。
1.override
不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。
也就是说,用override修饰符重写的基类中的方法必须是virtual,abstract或override方法
2.重载
当类包含两个名称相同但签名不同的方法时发生方法重载。
使用重载方法的指南:
a.用方法重载来提供在语义上完成相同功能的不同方法。
b.使用方法重载而不是允许默认参数。默认参数的版本控制性能不好,因此公共语言规范(CLS)中不允许使用默认参数。
c.正确使用默认值。在一个重载方法系列中,复杂方法应当使用参数名来指示从简单方法中假定的默认状态发生的更改。
d.对方法参数使用一致的排序和命名模式。提供一组重载方法,这组重载方法带有递增数目的参数,以使开发人员可以指定想要的级别的信息,这种情况很常见。您指定的参数越多,开发人员就可指定得越详细。
e.如果必须提供重写方法的能力,请仅使最完整的重载是虚拟的并根据它来定义其他操作。
//下面具体解释一下这种模式,只有最后一个方法(参数最完整的方法)是虚方法,在继承了这个类的子类中只要重写(override)这个方法就行了。
63.怎样理解静态变量?
静态变量具有在某一个类中具有全局型.64.向服务器发送请求有几种方式?
Post,Get.65.DataReader与Dataset有什么区别?
DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库.任何对SqlConnection的操作都会引发DataReader的异常.因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader的特殊性和高性能.所以DataReader是只进的.你读了第一条后就不能再去读取第一条了.DataSet则是将数据一次性加载在内存中.抛弃数据库连接.读取完毕即放弃数据库连接.因为DataSet将数据全部加载在内存中.所以比较消耗内存.但是确比DataReader要灵活.可以动态的添加行,列,数据.对数据库进行回传更新操作
66.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有
几种方法进行处理?
使用Request["string"].Request.QueryString["flag"]67.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
一般为3层,数据访问层,业务层,表示层。数据访问层对数据库进行增删查改。业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。表示层为了与用户交互例如用户添加表单。优点:分工明确,条理清晰,易于调试,而且具有可扩展性。缺点:增加成本。
68.软件开发过程一般有几个阶段?每个阶段的作用?
1)问题定义;2)可行性研究;3)需求分析;4)总体设计;5)详细设计;6)编码和单元测试;7)综合测试;8)软件维护。
69.微软推出了一系列的ApplicationBlock,请举出您所知道的ApplicationBlock并说明其作用?
SqlHelper列如:SqlHelper.ExcuteDataSet()执行存储过程.70.请列举一些您用到过的设计模式以及在什么情况下使用该模式?
抽象工廠71.通过超链接怎样传递中文参数?
传递时用HttpUtility.UrlEncodeUnicode("中文参数"),获取时直接用Request.QueryString["参数"]就行了<%@importnamespace="System.Web.Util"%>
72.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
foreach(Controlainthis.Page.Form.Controls)
stringname=a.GetType().Name;
if(a.GetType().Name=="TextBox")
TextBoxmm=aasTextBox;
mm.Text=string.Empty;
73.请编程实现一个冒泡排序算法?
privatestaticint[]Sort(int[]arrayNum)
inti,j,k;
boolexchange;
for(i=1;i exchange=false; for(j=arrayNum.Length-1;j>=i;j--) if(arrayNum[j-1]>arrayNum[j]) k=arrayNum[j]; arrayNum[j]=arrayNum[j-1]; arrayNum[j-1]=k; exchange=true; if(!exchange) break; returnarrayNum; 75.进程和线程的区别 进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。 76.成员变量和成员函数前加static的作用 它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。 77.堆和栈的区别 栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。 78.C#中property与attribute的区别,他们各有什么用处,这种机制的好处在哪里? 79.C#可否对内存进行直接的操作? 可以,我们知道,.NET相比C++最值得称赞的是他的GC(垃圾回收机制)。GC会在系统空闲或内存不足的时候自动回收不再被使用的对象。因此,我们不再需要向C++编程一样处处小心内存泄漏。同时,为了提高内存的使用效率,GC在回收内存的时候,会对内存进行整理,有些类似硬盘整理的原理。从而导致对象被在内存中移位。 80.维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么 尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策。 81.ADO.NET相对于ADO等主要有什么改进? 82.C#中要使一个类支持FOREACH遍历,实现过程怎样? 若要循环访问集合,集合必须满足特定的要求。例如,在下面的foreach语句中: foreach(ItemTypeiteminmyCollection) myCollection必须满足下列要求: 集合类型: 必须是interface、class或struct。 必须包括返回类型的名为GetEnumerator的实例方法,例如Enumerator。 Enumerator类型(类或结构)必须包含: 一个名为Current的属性,它返回ItemType或者可以转换为此类型的类型。属性访问器返回集合的当前元素。 一个名为MoveNext的bool方法,它递增项计数器并在集合中存在更多项时返回true。 有三种使用集合的方法: 1.使用上述指导创建一个集合。此集合只能用于C#程序。 2.使用上述指导创建一个一般集合,另外实现IEnumerable接口。此集合可用于其他语言(如VisualBasic)。 3.在集合类中使用一个预定义的集合。 83.接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么? 接口是一个纯粹的抽象类,没有任何实际的东西,只是定义了一个框架,而抽象类里面可以有实际的一个方法,并不要求所有的方法都是抽象的。可以实现一个接口中的所有方法,也可以继承一个抽象的类,然后覆写其中的方法。接口一般只有方法,而没有数据成员或属性。抽象类有方法,也有数据成员或属性,一般情况下,优先考虑用接口,只有当可能要访问到数据成员或属性时,用抽象类。 84.自定义控件和一般用户控件的异同?如果要用这两者之一,你会选择哪种?为什么 用户控件模型适合创建内部,应用程序特定的控件,而自定义控件模型更适合创建通用的和可再分发的控件 85.大概描述一下ASP.NET服务器控件的生命周期 1.初始化-Init事件(OnInit方法) 2.加载视图状态-LoadViewState方法 3.处理回发数据-LoadPostData方法:s对实现IPostBackDataHandler接口的控件,即可以自动加载回发数据的控件,如TextBox,DropDownList等。 4.加载-Load事件(OnLoad方法) 5.发送回发更改通知-RaisePostDataChangedEvent方法:对实现IPostBackDataHandler接口的控件,即可以自动加载回发数据的控件。在第3步中加载回发数据,如果回发前后数据发生更改,则在这一步触发相应的服务端事件。 6.处理回发事件-RaisePostBackEvent方法:对实现IPostBackEventHandler接口的控件,即能引起回发的控件,如Button,LinkButton,Calendar等 7.预呈现-PreRender事件(OnPreRender方法) 8.保存视图状态-SaveViewState方法 9.呈现-Render方法 10.处置-Dispose方法 11.卸载-UnLoad事件(OnUnLoad方法) 86.UML 統一建模语言(UML)是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。它记录了对必须构造的系统的决定和理解,可用于对系统的理解、设计、浏览、配置、维护和信息控制。 87.谈谈final,finally,finalize的区别。 88.&和&&的区别。 &&为逻辑与,输出结果为布尔(真假)型;&为按位与,输出结果为数值型。 89.GC是什么为什么要有GC 内存回收包含下列步骤: a.内存回收行程会搜寻在Managed程序代码中所参考的Managed对象。 b.内存回收行程会尝试最终处理未参考的对象。 c.内存回收行程会释放未参考并且回收其内存的对象。 90.Math.round(11.5)等於多少Math.round(-11.5)等於多少 Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回与参数最接近的长整数,参数加1/2 求其floor 91.shorts1=1;s1=s1+1;有什么错shorts1=1;s1+=1;有什么错 shorts1=1;s1=s1+1;(s1+1运算结果是int型,需要强制转换类型) shorts1=1;s1+=1;(可以正确编译) 92.数组有没有length()这个方法String有没有length()这个方法: 在c#数组和string只有length属性,没有方法 93.abstractclass和interface有什么区别 abstract修饰词可用于类别、方法、属性、索引子(Indexer)和事件。在类别宣告里使用abstract 饰词,表示该类别只是当做其它类别的基底类别而已。成员如果标记为抽象,或是包含在抽象类(AbstractClass)内,则必须由衍生自此抽象类别的类别实作这个成员。 在静态属性上使用abstract修饰词是错误的。 在抽象方法宣告中使用static或virtual修饰词是错误的。 接口只包含方法、委派或事件的签章。方法的实作(Implementation)是在实作接口的类别中完成, 94.是否可以继承String类 否,无法继承自密封类 95.try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后 会,在return后. 96.两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对 不对,有相同的GetHashCode(); 97.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那 这里到底是值传递还是引用传递 引用传递98.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上 都可以99.编程题:写一个Singleton出来。100.c#中的三元运算符是 ab:c 101.当整数a赋值给一个object对象时,整数a将会被 装箱 102.类成员有_____种可访问形式? this.;newClass().Method;103.publicstaticconstintA=1;这段代码有错误么?是什么? const不能用static修饰104.floatf=-123.567F;inti=(int)f;i的值现在是 密封,不能继承sealed修饰词可套用至类别(Class)、执行个体方法(InstanceMethod)和属性。密封类别无法被继承。密封方法会覆写基底类别(BaseClass)中的方法,但在任何衍生类别中却无法进一步覆写密封方法本身。当套用至方法或属性时,sealed修饰词必须一律和override(C#参考)搭配使用。 107.在Asp.net中所有的自定义用户控件都必须继承自 System.Web.UI.UserControl108.在.Net中所有可序列化的类都被标记为_____ [Serializable]109.在.Net托管代码中我们不用担心内存漏洞 派生出新的类,不可以直接创建T的任何实例。111.下面这段代码有错误么? 錯誤 switch(i){ case(): CaseZero(); case1: CaseOne(); case2: dufault;//wrong CaseTwo(); }112.在.Net中,类System.Web.UI.Page可以被继承么? 可以113.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义? new关键词可当做运算子、修饰词或条件约束(Constraint)使用。 用来建立对象并叫用(Invoke)建构函式 Class1o=newClass1(); 当new关键词做为修饰词时,会明确隐藏继承自基底类别的成员。隐藏继承的成员表示成员的衍生版本取代了基底类别版本。可以不使用new修饰词隐藏成员,但这么做会产生警告。使用new明确隐藏成员会隐藏这个警告,并记录使用衍生版本来替代。 new条件约束(Constraint)指定在泛用类别宣告中的任何型别参数,都必须具有公用的无参数建构函式。当您的泛用类别建立型别的新执行个体时,将此条件约束套用至型别参数 classItemFactory publicTGetNewItem() returnnewT(); using关键词有两种主要的用法: 做为指示词,此时它是用来建立命名空间的别名,或是用来汇入在其它命名空间中定义的型别。请参阅using指示词。 做为陈述式,此时它是用来定义一个范围,对象会在此范围结尾处进行处置(Dispose)。请参阅using陈述式。 114.谈谈类和结构的区别? 类是引用类型、结构是值类型 结构与类别使用的语法几乎相同,不过结构的限制比类别多: 结构执行个体字段宣告不可使用初始设定式,即使结构上的静态字段可初始化也一样 结构不可宣告预设建构函式,即没有参数的建构函式或解构函式 结构有下列属性: 结构是值类型,而类别为引用类型 当传递结构到方法上时,是以传值而非以当做参考的方式传递 与类别不同的是,结构不需使用new运算子就能执行个体化 结构可以宣告建构函式,但是必须采用参数 结构无法从另一个结构或类别继承而来,且它不能成为类别的基底。所有结构都是从继承自System.Object的System.ValueType直接继承而来 结构可实作接口 在结构里初始化执行个体字段是错误的115.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来 实现。 string[]LetterList=newstring[]{"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; StringBuildersbRe=newStringBuilder(); Randomrd=newRandom(); for(inti=0;i<10000;i++) sbRe.Append(LetterList[rd.Next(26)]); Console.Write(sbRe.ToString());116.对于这样的一个枚举类型: enumColor:byte{ Red, Green, Blue, Orange 试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值。 foreach(stringaainEnum.GetNames(typeof(Color))) Console.Write(aa); Console.Write(""r"n"); foreach(byteaainEnum.GetValues(typeof(Color))) 117.写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”. stringkk="abc',.字符串"; stringreKK=""; for(inti=0;i reKK=kk[i]+reKK; Console.Write(reKK);118.什么是虚函数? VirtualCallSomeOne();119.什么是抽象函数? publicabstractvoidCallSomeOne();120.触发器的作用 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。数据库触发器有以下的作用: 安全性。可以基于数据库的值使用户具有操作数据库的某种权利。 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。 审计。可以跟踪用户对数据库的操作。 审计用户操作数据库的语句。 把用户对数据库的更新写入审计表。 实现复杂的数据完整性规则。 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。 提供可变的缺省值。 在修改或删除时级联修改或删除其它表中的与之匹配的行。 在修改或删除时把其它表中的与之匹配的行设成NULL值。 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。 121.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m publicstaticintFoo(inti) intresult=0; for(intj=1;j if(j%2==0) result=result-j; elseif(j%2==1) result=result+j; returnresult; }122.C#中的委托是什么?事件是不是一种委托? 委派是参考方法的一种型别,一旦将一个方法指定给某委派,则该委派的行为便会与该方法完全相同。委派方法可以当做任何其它方法一般使用,也有参数和传回值, 任何与委派的签名码(即由传回型别和参数所组成)相符的方法,都可指派给委派。如此便可利用程序设计的方式变更方法呼叫,也可将新的程序代码外挂至现有类别中。只要您知道委派的签名码为何,即可指派自己的委派方法。 由于委派能够将方法当做参数来参考,使得委派很适合用来定义回呼方法。例如,您可以将比较两个对象的方法参考传递至排序算法。分开撰写比较程序代码,可让您撰写更适合通用的算法。 委派有下列属性: a.委派与C++函式指标类似,但为型别安全。 b.委派允许将方法当做参数传递。 c.委派可用于定义回呼方法。 d.您可将委派链接在一起,例如,可在单一事件上呼叫多个方法。 123.C#中,执行以下代码后S的结果: string[]a=newstring[7]; aa[0]="33"; aa[6]="66"; strings=""; foreach(stringminaa)s+=m; 3366124.适配器datadapter的作用 125.所有类中最顶层的类是哪个类 System.Object126.跳转页面有哪几种方式? Response.Redirect(""); Server.Transfer(""); Server.Execute("");127.类包含哪些成员 1.建构函式2.解构函式3.常数4.字段5.方法6.属性7.索引子8.运算子9.事件10.委派 11.类别12.界面13.结构 128.索引器 索引子(Indexer)允许使用与数组相同的方式来索引类别或结构的执行个体。索引子除了其存取子需要使用参数以外,其余特性都与属性相似。 a.索引子让对象能以类似数组的方式来索引。 b.get存取子会传回一个值。set存取子会指定一个值。 c.this关键词的用途为定义索引子。 d.value关键词是用来定义set索引子所指定的值。 e.索引子不需要以整数值来索引;您可以决定如何定义特定的查询机制。 f.索引子可以多载。 g.索引子可以具有一个以上的型式参数,例如,在存取二维数组时便是如此。 classSampleCollection privateT[]arr=newT[100]; publicTthis[inti] get returnarr[i]; set arr[i]=value; }129.HYPERLINK和linkbotton控件的差别 HYPERLINK导航。 使用LinkButton控件,在Web网页上建立超级链接样式按钮。LinkButton控件具有与HyperLink控件相同的外观,但拥有与Button控件相同的功能。 130.DataReader与Dataset有什么区别? 执行查询时会传回结果,并一直储存于客户端上的网络缓冲区中,直至您使用DataReader的Read方法要求它们为止。使用DataReader可以提高应用程序的效能,方法是立即撷取可用的数据,及(依预设)一次只将一个数据列储存到内存中,从而减少系统负荷 131.简要说出private、protected的区别 private存取只限于包含类别。 protected存取只限于包含的类别或衍生自包含类别的型别。132.说出下面几个函数的区别: privatevoidtest(stringstr){…} privatevoidtest(refstringstr){…} privatevoidtest(outstringstr){…} out关键词会导致以传址(ByReference)方式传递自变量。这点与ref关键词相类似,除了ref需要在传递变量之前先初始化变量以外。若要使用out参数,方法定义和呼叫方法都必须明确使用out关键词。 Response.Write()方法) Response.Write(""); 134.说出下面各处正确或错误的理由(写在该行) classTest intx; staticinty; voidF(){ x=1;//ok y=1;//ok staticvoidG(){ x=1;//error非靜態成員不能在靜態 Testt=newTest(); t.x=1;//Ok t.y=1;//Error Test.x=1;//Error Test.y=1;//Ok 135.简要的谈谈你对多态的理解,并简单的实现一个多态的例子136.下面关于索引的描述中。哪些是正确的?(AB) A、索引能够加快查询的速度 B、索引可能会降低数值的更新速度 C、应该尽可能多的为表建立索引 137.请描述一下在.net中Forms认证模式下,怎样用代码(用户名单存在数据库中,而不是WebConfig中) Machine.config 139.假设有一个数据库字段name,需要在网页中只显示该字段的姓,而隐藏名字,类似“张**”形式,请写 出数据绑定的自定义表达式。140.请简单描述一下制作一个用户控件(UserControl)的过程。141.您有没有制作过自定义的webcontrol(注意不是用户控件)?如果有,请描述一下自定义控件制作基本 过程,主要重载哪些方法?。142.请描述构成ADO.net的主要对象以及他们的作用。143.你编写一段程序来判断服务器请求是get,还是post请求? stringmm=Request.ServerVariables["REQUEST_METHOD"]; stringll=Request.ServerVariables["QUERY_STRING"];144.如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明. publicclassTestA publicstaticintCount; Count=Count+1; publicintCountA get{returnCount;} TestAtesta=newTestA(); TestAtestb=newTestA(); TestAtestb1=newTestA(); TestAtestb2=newTestA(); TestAtestb3=newTestA(); TestAtestb4=newTestA(); TestAtestb5=newTestA(); Console.Write(testb.CountA);145.是否了解URLRewrite?请简要说明其原理和在ASP.NET中的实现方式。 URL重写是截取传入Web请求并自动将请求重定向到其他URL的过程.146.ASP.NET中如何调用WebService的方法? 添加引用 TestService.Servicets=newTestService.Service(); DataSetds=ts.GetUserInfo("",""); Response.Write(ds.Tables[0].Rows.Count);147.ViewState的作用和实现方式? ViewState属性提供Dictionary对象来保留对相同网页的多个要求之间的值。这是网页用来在来回往返之间保留网页和控件属性值的预设方法。处理网页时,网页目前的状态和控件会杂凑至字符串中,并且储存在网页中当做一个隐藏字段,或是如果储存在ViewState属性的数据量超过MaxPageStateFieldLength属性中指定的值时,则会当做多个隐藏字段。网页回传到服务器时,网页会在网页初始化时剖析检视状态字符串,并且还原网页中的属性资 148.如何实现页面分段缓存? 页面分段缓存 页面分段缓存是用用户控件实现的。通过为页面每个区域创建单独的用户控件来定义页面的区域。在每个用户控件中,可以使用Output-Cache指令指出如何缓存控件的输出。 1、注意分段缓存不支持Location特性;缓存页面分段惟一合法的地方是web服务器。这是因为分段缓存在ASP.NET中是新的功能,所以浏览器和代理服务器不支持。 2、分段缓存有另外一个在页面缓存中没有的特性——VaryByControl。VaryByControl特性允许指定一个由分号分隔的字符串列表,代表用户控件内使用的控件的名称;ASP.NET将针对值的每个不同的组合生成用户构件的一个缓存版本。 页面分段缓存的限制 1、如果为用户控件启用了缓存,就不能在包含它的页面中通过程序访问此控件了; 例如:ctlContents.Message="Hello!" 2、不应该对缓存的用户控件使用数据绑定语法; 不允许: 149.你是否知道下列名字:.NETPetShop,IBuySpyStore,DotNetNuke,NUnit,DataAccessApplication Block?说说它们分别都是什么。150.如何实现XML系列化(给出简单的代码示例) XML序列化只会将对象的公用字段和属性值序列化为XML数据流。 XML序列化不会转换方法、索引子、私用字段或只读属性(只读集合则除外)。若要序列化对象的所有字段和属性(包括公用和私用的),请使用BinaryFormatter,而不要使用XML序列化。 publicclassTestXML publicstringUserName; publicstringAddress; publicstringCompany; publicstringDescription; XmlSerializerserializer= newXmlSerializer(typeof(TestXML)); stringFilePath=Server.MapPath("XML/woody.xml"); TestXMLtx=newTestXML(); tx.Address="MITC"; tx.Company="MDS"; tx.Description="WOODY"; tx.UserName="WU"; Streamwriter=newFileStream(FilePath,FileMode.Create); serializer.Serialize(writer,tx); writer.Close(); 151.你知道AJAX吗?说说它的特点和一般实现方式152.写出一段利用XMLHTTP工作的简单代码153.如何定义嵌套的CSS样式类 table.hover{background-color:white;border-right:1pxsolid#f1f1f1}154..NETRemoting的工作原理是什么?请简要地写出一个.NETRemoting的示例 分布式处理方式,在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界. Remoting的通道主要有两种:Tcp和Http。在.Net中,System.Runtime.Remoting.Channel中定义了IChannel接口。IChannel接口包括了TcpChannel通道类型和Http通道类型。它们分别对应Remoting通道的这两种类型。 TcpChannel类型放在名字空间System.Runtime.Remoting.Channel.Tcp中。Tcp通道提供了基于Socket的传输工具,使用Tcp协议来跨越Remoting边界传输序列化的消息流。TcpChannel类型默认使用二进制格式序列化消息对象,因此它具有更高的传输性能。HttpChannel类型放在名字空间System.Runtime.Remoting.Channel.Http中。它提供了一种使用Http协议,使其能在Internet上穿越防火墙传输序列化消息流。默认情况下,HttpChannel类型使用Soap格式序列化消息对象,因此它具有更好的互操作性。通常在局域网内,我们更多地使用TcpChannel;如果要穿越防火墙,则使用HttpChannel. WebRequestrequest=WebRequest.Create(PageUrl); WebResponseresponse=request.GetResponse(); StreamresStream=response.GetResponseStream(); StreamReadersr=newStreamReader(resStream,System.Text.Encoding.Default); stringKK=sr.ReadToEnd(); resStream.Close(); sr.Close();156.对于WebServices,.NETRemoting,MSMQ,EnterpriseServices这四个中接触过多少?能否简要的介绍 他们的特点 157.可否简要的介绍asp.net2.0Membership,WebPart和C#的匿名函数和泛型,希望可以简要地阐述其中 的特点 Membership: Membership类别是用在ASP.NET应用程序中,以验证使用者认证,并管理使用者设定,例如密码和电子邮件地址。Membership类别可以单独使用,也可以结合FormsAuthentication使用,以建立验证Web应用程序或网站使用者的完整系统。Login控件会封装Membership类别,以提供验证使用者的便利机制。 Membership类别提供多项功能,以供进行:建立新使用者。 将成员资格信息(使用者名称、密码、电子邮件地址,以及支持数据)存放于MicrosoftSQLServer或替代数据存放区中。 验证造访您网站的使用者。您可以透过程序设计方式验证使用者,您也可以使用Login控件,建立需要少数或不需要程序代码的完整验证系统。 管理密码,其中包括建立、变更、撷取,及重设等动作。您也可以选择设定ASP.NET成员资格,向遗忘密码的使用者要求密码问题和解答,以验证密码重设或撷取要求。 WebPart: 藉由使用Web组件控件集合,开发人员可让使用者执行下列功能: 个人化页面内容。使用者可以将新的Web组件控件加入至页面,或是移除、隐藏或最小化控件,如同使用普通窗口一样。 个人化页面配置。使用者可以将Web组件控件拖曳至页面上的不同区域,或变更其外观、属性和行为。 汇出和汇入控件。使用者可以汇入或汇出Web组件控件设定以用于其它页面或网站,并保留控件中的属性、外观或甚至数据,如此可让使用者减少数据输入和组态设定的需要。 与区域变量不同的是,外部变量的存留期会延续,直到参考匿名方法的委派可进行内存回收为止。n的参考是在建立委派时所撷取。 匿名方法: 将程序代码区块当做委派参数传递的一种方式 藉由使用匿名方法,您无须另外建立方法,因而可以减少在执行个体化委派时所需要另外撰写的程序代码。 匿名方法不能存取外部范围的ref或out参数。 anonymous-method-block内不能存取Unsafe程序代码。 button1.Click+=delegate(System.Objecto,System.EventArgse) {System.Windows.Forms.MessageBox.Show("Click!");}; 泛型: 泛型是指一些类别、结构、接口和方法,而它们具有其储存或使用的一或多个型别之替代符号(型别参数)。泛型集合类别可能会将型别参数当做它所储存的对象型别之替代符号;这些型别参数会以其字段型别及其方法的参数型别之形式出现。泛型方法可能会将它的型别参数当做其传回值的型别或是其中一个正规参数的型别使用。 System.Collections.Generic和System.Collections.ObjectModel命名空间中的泛型集合类别158.如何理解责任链和命令模式的异同? 159.数据量下的列表显示分页如何处理?160.附件上传后的保存方式以及如何浏览? stringFileVName=DateTime.Now.ToString("yyyyMMddHHmm")+WebCom.RandomnAlpha(7)+fileExt; file_up_load.PostedFile.SaveAs(loadFilePath+FileVName);161.面向对象中的基类指什么,什么时候用到基类162.存储过程跟SQL语句比较,各有什么优点和缺点?163.描述怎样区分使用ExecuteNonQuery和ExecuteScalar方法? ExecuteNonQuery: 使用ExecuteNonQuery以执行数据库目录(Catalog)作业(例如,查询数据库结构或建立如数据表的数据库对象),或藉由执行UPDATE、INSERT或DELETE陈述式变更数据库的数据。 虽然ExecuteNonQuery不传回任何数据列,但是对应至参数的任何输出参数或传回值会填入(Populate)资料。对UPDATE、INSERT和DELETE陈述式而言,传回值是受命令影响的数据列数目。对其他类型的陈述式而言,传回值为-1。 ExecuteScalar: 执行查询,并传回查询所传回的结果集中第一个数据列的第一个资料行。会忽略所有其它的数据行和数据列。 164.SQL语句中是否用过Sum,Count,Top,GroupBy,Case...When这些关键字,请描述具体用法? Sum加總;Count:記錄總數;Top:前多少條;GroupBy集合函數;Case...When條件語句165.是否用过XmlSchema或者DTD,怎样使用一个XmlSchema或者DTD去校验一个xml的格式是否正确? XmlTextReadertr=newXmlTextReader(Server.MapPath("XML/woody.xml")); XmlValidatingReadervr=newXmlValidatingReader(tr); vr.ValidationType=ValidationType.DTD; vr.ValidationEventHandler+=newValidationEventHandler(ValidationHandler); while(vr.Read());166.是否使用过Xsl样式表?解释xsl:apply-templates,xsl:call-template,xsl:choose,xsl:value-of 的用法? XSL之于XML,就像CSS之于HTML。它是指可扩展样式表语言(EXtensibleStylesheetLanguage)。这是一种用于以可读格式呈现XML数据的语言。XSL实际上包含两个部分: *XSLT–用于转换XML文档的语言 *XPath–用于在XML文档中导航的语言 XSLT是指XSL转换(XSLTransformation),它是XSL最重要的部分。 XSLT可以将XML文档转换为其它XML文档、XHTML输出或简单的文本。这通常是通过将每个XML元素转换为HTML元素来完成的。由于XML标签是用户定义的,浏览器不知道如何解释或呈现每个标签,因此必须使用XSL。XML标签的意义是为了方便用户(而不是计算机)理解。 XSLT还可以对XML树进行下列操作: *添加和删除元素 *添加和删除属性 *对元素进行重新排列或排序 *隐藏或显示某些元素 *查找或选择特定元素 XSL语法 XSL是否与XML相同? 既是又不是。说是,是因为它们遵循相同的语法规则(只有少许差异,下面我将会讲到)。说不是,是因为它们的用途不同:XML用于承载数据,而XSL则用于设置数据的格式。 这是因为,根据W3C联盟的建议,它还包含命名空间和XSL规范的版本。 请注意,这并不与XML语法规则冲突:XSL样式表是完全有效的XML文档,因为它有一个根元素,由 在什么情况下应该使用XSL? XSL在设计时有几个目标用途,这些用途使它成为某些开发情况下的完美解决方案,而对另一些开发情况则毫无用处。 XSL专门用于处理XML文档,并且遵循XML语法。因此,它只能在支持XML的应用程序中与XML结合使用。最合适使用XML和XSL的情况是:Web门户、新闻聚合器、社区网站或其它任何需要向各种设备及大量客户端提供信息的Web应用程序。 XSLT是一种基于模式匹配的语言。它会查找匹配特定条件的节点,然后应用相应的规则。因此,它不具备大多数编程语言的计算能力。例如,XSL无法在运行时更改变量的值。它不应该用于从使用复杂公式的动态数据源(例如在线商店)来计算值。Web编程语言更适于此用途。 XSL不能代替或补充CSS。它不应(也不能)用于设置HTML的样式。但是,您可以将其用于需要频繁重新设计可视化效果、频繁更换布局以及以灵活格式处理数据的网站。 XSL不是内容管理工具。它不应(也不能)用于更改XML文档的内容或者编辑信息。但是,您可以将XML和XSL用于需要处理几种不同格式文档的内容管理系统。 167.讲一讲你理解的webservice,在dotnetframework中,怎么很好的结合xml(讲概念就行了) 168.用C#实现以下功能 a产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。 b对上面生成的数组排序,需要支持升序、降序两种顺序 169.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅 保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个. FilterStr=Regex.Replace(FilterStr,"[\\s]{2,}",""); 172.设有关系EMP(ENO,ENAME,SALARY,DNO),其中各属性的含义依次为职工号、姓名、工资和所在部门号,以及关系DEPT(DNO,DNAME,MANAGER),其中各属性含义依次为部门号、部门名称、部门经理的职工号。试用SQL语句完成以下查询: a)列出各部门中工资不低于600元的职工的平均工资。selectdno,avg(salary)asaveragefromempwheresalary>=600groupbydno b)查询001号职工所在部门名称。selectDNAMEfromdeptwhereDNO=(selectDNOfromempwhereeno=’001’)或者selectd.dnamefromdeptasdleftjonempaseone.dno=d.dnowheree.eno=’001’ c)请用SQL语句将“销售部”的那些工资数额低于600的职工的工资上调10%。updateEMPsetSALARY=SALARY*(1+0.1)whereSALARY<600andDNO=(selectDNOfromdeptwheredname=‘销售部’) 173.程序补充 usingSystem; classPoint publicintx,y,z; publicPoint() x=0; y=0; z=0; publicPoint(intx,inty,intz) this.x=x; this.y=y; this.Z=y; publicoverridestringToString() return(String.Format("({0},{1},{2})",x,y,z)); classMainClass staticvoidMain() Pointp1=newPoint(); Pointp2=newPoint(10,20,30); Console.WriteLine("三维中各点坐标:"); Console.WriteLine("点1的坐标为{0}",p1); Console.WriteLine("点2的坐标为{0}",p2); 174.程序填空 classSwitchTest Console.Write("请输入您的选择:"); strings=Console.ReadLine(); intn=int.Parse(s); intcost=0; switch(n) case0: cost=0; Break; cost=100; case3: cost=300; default: Console.WriteLine("错误的选择.请输入1,2,或者3."); if(cost!=0) 175.设计模式 我们公司有很多产品,有些产品比较早,设计上不是非常完善。现在我们有一个系统整合了其它产品的身份认证,即其它产品的身份认证全部由该系统完成。现在的问题是,由于各个系统采用的密码加密算法不一致(都是不可逆算法),请你选择合适的设计模式,完成密码校验的功能。 176.装箱、拆箱操作发生在:(C) A.类与对象之间B.对象与对象之间 C.引用类型与值类型之间D.引用类型与引用类型之间177.用户类若想支持Foreach语句需要实现的接口是:(AB) A.IEnumerableB.Ienumerator C.ICollectionD.ICollectData178.NetFramework通过什么与COM组件进行交互操作?(C) A.SideBySideB.WebService C.InteropD.PInvoke179.装箱与拆箱操作是否是互逆的操作?(B) A.是B.否180.以下哪个是可以变长的数组?(BD) A.ArrayB.string[] C.string[N]D.ArrayList181.用户自定义异常类需要从以下哪个类继承:(A) A.ExceptionB.CustomException C.ApplicationExceptionD.BaseException182.以下代码段中能否编译通过?请给出理由。 Try catch(FileNotFoundExceptione1) catch(Exceptione2) catch(IOExceptione3) Catch 不可以, IOException继承于Exception 之前的catch子句已经取得所有属于此类别或超级类别('System.Exception')的例外状况 A.CloseB.DisposeC.Finalize D.usingE.Quit184..Net依赖以下哪项技术实现跨语言互用性?(C) A.CLRB.CTSC.CLSD.CTT 185.请问:String类与StringBuilder类有什么区别?为什么在.Net类库中要同时存在这2个类? String或StringBuilder对象之串连作业的效能是根据内存的配置频率而定。String串连作业永远都会配置内存,而StringBuilder串连作业只有在StringBuilder对象缓冲区太小而无法容纳新数据时,才会配置内存。因此,如果要串连固定数目的String对象,最好使用String类别的串连作业。在这种情况下,编译器甚至可能将个别的串连作业结合成一个单一作业。如果要串连任意数目的字符串(例如,如果循环串连任意数目的使用者输入字符串),则对于串连作业来说最好使用StringBuilder对象。 186.以下哪个类是int的基类?(B) A.Int32B.ObjectC.ValueTypeD.Int16 187.以下哪些可以作为接口成员?(多选)(ABD) A.方法B.属性C.字段D.事件E.索引器F.构造函数G.析构函数188.以下关于ref和out的描述哪些项是正确的?(多选)(AC) A.使用ref参数,传递到ref参数的参数必须最先初始化。 B.使用out参数,传递到out参数的参数必须最先初始化。 C.使用ref参数,必须将参数作为ref参数显式传递到方法。 D.使用out参数,必须将参数作为out参数显式传递到方法。189.“访问范围限定于此程序或那些由它所属的类派生的类型”是对以下哪个成员可访问性含义的正确描述(B) A.publicB.protectedC.internalD.protectedinternal190.classClass1 privatestaticintcount=0; staticClass1() count++; publicClass1() Class1o1=newClass1(); Class1o2=newClass1(); 请问,o1.Count的值是多少?(B) A.1B.2C.3D.4191.abstractclassBaseClass publicvirtualvoidMethodA() publicvirtualvoidMethodB() classClass1:BaseClass publicvoidMethodA(stringarg) publicoverridevoidMethodB() classClass2:Class1 newpublicvoidMethodB() publicstaticvoidMain(string[]args) Class2o=newClass2(); Console.WriteLine(o.MethodA()); 请问,o.MethodA调用的是:(A) A.BaseClass.MethodAB.Class2.MethodA C.Class1.MethodAD.都不是 192.您需要创建一个ASP.NET应用程序,公司考虑使用Windows身份认证。所有的用户都存在于AllWin这个域中。您想要使用下列认证规则来配置这个应用程序: 1.匿名用户不允许访问这个应用程序。 2.所有雇员除了Tess和King都允许访问这个应用程序。 请问您应该使用以下哪一个代码段来配置这个应用程序?() A. B. C. D. E. 193要创建一个显示公司员工列表的应用程序。您使用一个DataGrid控件显示员工的列表。您打算修改这个控件以便在这个Grid的Footer显示员工合计数。请问您应该怎么做?(BC) A.重写OnPreRender事件,当Grid的Footer行被创建时显示合计数。 B.重写OnItemCreated事件,当Grid的Footer行被创建时显示合计数。 C.重写OnItemDataBound事件,当Grid的Footer行被创建时显示合计数。 D.重写OnLayout事件,当Grid的Footer行被创建时显示合计数。194.创建ASP.NET应用程序用于运行AllWin公司内部的Web站点,这个应用程序包含了50个页面。 您想要配置这个应用程序以便当发生一个HTTP代码错误时它可以显示一个自定义的错误页面给用户。 您想要花最小的代价完成这些目标,您应该怎么做?(多选)(AD) A.在这个应用程序的Global.asax文件中创建一个Application_Error过程去处理ASP.NET代码错误。 B.在这个应用程序的Web.config文件中创建一个applicationError节去处理ASP.NET代码错误。 C.在这个应用程序的Global.asax文件中创建一个CustomErrors事件去处理HTTP错误。 D.在这个应用程序的Web.config文件中创建一个CustomErrors节去处理HTTP错误。 E.在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET代码错误。 F.在这个应用程序的每一页中添加一个Page指示符去处理ASP.NETHTTP错误。 195.您为AllWin公司创建了一个ASP.NET应用程序。这个应用程序调用一个XmlWebService。这个XmlWebService将返回一个包含了公司雇员列表的DataSet对象。请问您该如何在这个程序中使用这个XmlWebService?(b) A.在“引用”对话框的.Net标签中选择System.Web.Services.dll。 B.在“Web引用”对话框中输入这个XMLWebservice的地址。 C.在您的Global.asax.cs中添加一条using语句并指定这个XMLWebservice的地址。 D.在您的Global.asax.cs中写一个事件处理器导入这个XmlWebService相应的.wsdl和.disco文件。 Csharp面试模拟题基于MSDN的回答 1、请解释在new与override的区别? new运算符用于在堆上创建对象和调用构造函数。 new运算符用于创建对象和调用构造函数。 new修饰符用于隐藏基类成员的继承成员。 通过继承隐藏名称采用下列形式之一: 引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。 引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。 引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。 在同一成员上同时使用new和override是错误的。 2.请解释virtual的含义? 3.请解释.net采用委托实现的事件模型与JAVA中采用接口实现的事件模型有什么区别,以图示方式解释。 事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。 在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NETFramework定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。 委托是一个可以对方法进行引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。这里只讨论委托的事件处理功能。 观察者模式(Observer)是对象的行为模式,又称: 发布-订阅模(ublish/Subscribe)源-监听器Source/Listener) 观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。 这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新 4.请解释接口的显式实现有什么意义? 对接口有以下限制: 不能向成员或接口自身附加安全性限制。 接口可以定义类构造函数,但不能定义实例构造函数。 某些情况下,接口成员的名称对于实现该接口的类可能是不适当的,此时,可以使用显式接口成员实现来实现该接口成员。例如,一个用于“文件抽象”的类一般会实现一个具有释放文件资源作用的Close成员函数,同时还可能使用显式接口成员实现来实现接口的方法 在方法调用、属性访问或索引器访问中,不能直接访问“显式接口成员实现”的成员,即使用它的完全限定名也不行。“显式接口成员实现”的成员只能通过接口实例访问,并且在通过接口实例访问时,只能用该接口成员的简单名称来引用。 显式接口成员实现中包含访问修饰符属于编译时错误,而且如果包含abstract、virtual、override或static修饰符也属于编译时错误。 显式接口成员实现具有与其他成员不同的可访问性特征。由于显式接口成员实现永远不能在方法调用或属性访问中通过它们的完全限定名来访问,因此,它们似乎是private(私有的)。但是,因为它们可以通过接口实例来访问,所以它们似乎又是public(公共的)。 显式接口成员实现有两个主要用途: 由于显式接口成员实现不能通过类或结构实例来访问,因此它们就不属于类或结构的自身的公共接口。当需在一个公用的类或结构中实现一些仅供内部使用(不允许外界访问)的接口时,这就特别有用。 显式接口成员实现可以消除因同时含有多个相同签名的接口成员所引起的多义性。如果没有显式接口成员实现,一个类或结构就不可能为具有相同签名和返回类型的接口成员分别提供相应的实现,也不可能为具有相同签名和不同返回类型的所有接口成员中的任何一个提供实现。 请以图示方式解释性.netframework .NETFramework是一种新的计算平台,它简化了在高度分布式Internet环境中的应用程序开发。.NETFramework旨在实现下列目标: .NETFramework具有两个主要组件:公共语言运行库和.NETFramework类库。公共语言运行库是.NETFramework的基础。您可以将运行库看作一个在执行时管理代码的代理,它提供核心服务(如内存管理、线程管理和远程处理),而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。.NETFramework的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面(GUI)应用程序,也包括基于ASP.NET所提供的最新创新的应用程序(如Web窗体和XMLWebservices)。 .NETFramework可由非托管组件承载,这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行,从而创建一个可以同时利用托管和非托管功能的软件环境。.NETFramework不但提供若干个运行库宿主,而且还支持第三方运行库宿主的开发。 例如,ASP.NET承载运行库以为托管代码提供可伸缩的服务器端环境。ASP.NET直接使用运行库以启用ASP.NET应用程序和XMLWebservices(本主题稍后将对这两者进行讨论)。 InternetExplorer是承载运行库(以MIME类型扩展的形式)的非托管应用程序的一个示例。使用InternetExplorer承载运行库使您能够在HTML文档中嵌入托管组件或Windows窗体控件。以这种方式承载运行库使得托管移动代码(类似于MicrosoftActiveX控件)成为可能,但是它具有只有托管代码才能提供的重大改进(如不完全受信任的执行和安全的独立文件存储)。 下面的插图显示公共语言运行库和类库与应用程序之间以及与整个系统之间的关系。该插图还显示托管代码如何在更大的结构内运行。 .NETFramework环境 下面的章节将更加详细地描述.NETFramework的主要组件和功能。 公共语言运行库管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务。这些功能是在公共语言运行库上运行的托管代码所固有的。 运行库强制实施代码访问安全。例如,用户可以相信嵌入在Web页中的可执行文件能够在屏幕上播放动画或唱歌,但不能访问他们的个人数据、文件系统或网络。这样,运行库的安全性功能就使通过Internet部署的合法软件能够具有特别丰富的功能。 运行库还通过实现称为通用类型系统(CTS)的严格类型验证和代码验证基础结构来加强代码可靠性。CTS确保所有托管代码都是可以自我描述的。各种Microsoft和第三方语言编译器生成符合CTS的托管代码。这意味着托管代码可在严格实施类型保真和类型安全的同时使用其他托管类型和实例。 此外,运行库的托管环境还消除了许多常见的软件问题。例如,运行库自动处理对象布局并管理对对象的引用,在不再使用它们时将它们释放。这种自动内存管理解决了两个最常见的应用程序错误:内存泄漏和无效内存引用。 运行库还提高了开发人员的工作效率。例如,程序员可以用他们选择的开发语言编写应用程序,却仍能充分利用其他开发人员用其他语言编写的运行库、类库和组件。任何选择以运行库为目标的编译器供应商都可以这样做。以.NETFramework为目标的语言编译器使得用该语言编写的现有代码可以使用.NETFramework的功能,这大大减轻了现有应用程序的迁移过程的工作负担。 尽管运行库是为未来的软件设计的,但是它也支持现在和以前的软件。托管和非托管代码之间的互操作性使开发人员能够继续使用所需的COM组件和DLL。 运行库旨在增强性能。尽管公共语言运行库提供许多标准运行库服务,但是它从不解释托管代码。一种称为实时(JIT)编译的功能使所有托管代码能够以它在其上执行的系统的本机语言运行。同时,内存管理器排除了出现零碎内存的可能性,并增大了内存引用区域以进一步提高性能。 最后,运行库可由高性能的服务器端应用程序(如MicrosoftSQLServer和Internet信息服务(IIS))承载。此基础结构使您在享受支持运行库宿主的行业最佳企业服务器的优越性能的同时,能够使用托管代码编写业务逻辑。 例如,.NETFramework集合类实现一组可用于开发您自己的集合类的接口。您的集合类将与.NETFramework中的类无缝地混合。 .NETFramework类型使您能够完成一系列常见编程任务(包括诸如字符串管理、数据收集、数据库连接以及文件访问等任务)。除这些常见任务之外,类库还包括支持多种专用开发方案的类型。例如,可使用.NETFramework开发下列类型的应用程序和服务: 例如,Windows窗体类是一组综合性的可重用的类型,它们大大简化了WindowsGUI的开发。如果要编写ASP.NETWeb窗体应用程序,可使用Web窗体类。 客户端应用程序在基于Windows的编程中最接近于传统风格的应用程序。这些是在桌面上显示窗口或窗体从而使用户能够执行任务的应用程序类型。客户端应用程序包括诸如字处理程序和电子表格等应用程序,还包括自定义的业务应用程序(如数据输入工具、报告工具等等)。客户端应用程序通常使用窗口、菜单、按钮和其他GUI元素,并且它们可能访问本地资源(如文件系统)和外围设备(如打印机)。 另一种客户端应用程序是作为Web页通过Internet部署的传统ActiveX控件(现在被托管Windows窗体控件所替代)。此应用程序非常类似于其他客户端应用程序:它在本机执行,可以访问本地资源,并包含图形元素。 过去,开发人员将C/C++与Microsoft基础类(MFC)或应用程序快速开发(RAD)环境(如MicrosoftVisualBasic)一起使用来创建这样的应用程序。.NETFramework将这些现有产品的特点合并到了单个且一致的开发环境中,该环境大大简化了客户端应用程序的开发。 包含在.NETFramework中的Windows窗体类旨在用于GUI开发。您可以轻松创建具有适应多变的商业需求所需的灵活性的命令窗口、按钮、菜单、工具栏和其他屏幕元素。 和ActiveX控件不同,Windows窗体控件具有对用户计算机的不完全受信任的访问权限。这意味着二进制代码或在本机执行的代码可访问用户系统上的某些资源,例如GUI元素和访问受限制的文件,但这些代码不能访问或危害其他资源。由于具有代码访问安全性,许多曾经需要安装在用户系统上的应用程序现在可以通过Web安全地部署。您的应用程序可以在像Web页那样部署时实现本地应用程序的功能。 在托管领域中,服务器端应用程序是通过运行库宿主实现的。非托管应用程序承载公共语言运行库,后者使您的自定义托管代码可以控制服务器的行为。此模型在获得主服务器的性能和可伸缩性的同时提供给您公共语言运行库和类库的所有功能。 下面的插图显示在不同服务器环境中运行托管代码的基本网络架构。在应用程序逻辑通过托管代码执行时,服务器(如IIS和SQLServer)可执行标准操作。 服务器端托管代码 ASP.NET是使开发人员能够使用.NETFramework开发基于Web的应用程序的宿主环境。但是,ASP.NET不止是一个运行库宿主;它是使用托管代码开发Web站点和通过Internet分布的对象的完整结构。Web窗体和XMLWebservices都将IIS和ASP.NET用作应用程序的发布机制,并且两者在.NETFramework中都具有支持类集合。 XMLWebservices作为基于Web的技术的重要发展,是类似于常见Web站点的分布式服务器端应用程序组件。但是,与基于Web的应用程序不同,XMLWebservices组件不具有UI并且不以浏览器(如InternetExplorer和NetscapeNavigator)为目标。XMLWebservices由旨在供其他应用程序使用的可重用的软件组件组成,所谓的其他应用程序包括:传统的客户端应用程序,基于Web的应用程序,甚至是其他XMLWebservices。因此,XMLWebservices技术正迅速地将应用程序开发和部署推向高度分布式Internet环境。 如果您使用过ASP技术的早期版本,很快就会注意到ASP.NET和Web窗体提供的改进。例如,您可以用支持.NETFramework的任何语言开发Web窗体页。此外,您的代码不再需要与HTTP文本共享同一个文件(尽管如果您愿意,代码还可以继续这样做)。Web窗体页用本机语言执行,这是因为与所有其他托管应用程序一样,它们充分利用运行库。与此相对照,非托管ASP页始终被写成脚本并解释。ASP.NET页比非托管ASP页更快、更实用并且更易于开发,这是因为它们像所有托管应用程序一样与运行库进行交互。 .NETFramework还提供类和工具的集合来帮助开发和使用XMLWebservices应用程序。XMLWebservices是基于SOAP(一种远程过程调用协议)、XML(一种可扩展的数据格式)和WSDL(Web服务描述语言)这些标准生成的。基于这些标准生成.NETFramework的目的是为了提高与非Microsoft解决方案的互操作性。 例如,.NETFrameworkSDK所包含的Web服务描述语言工具可以查询在Web上发布的XMLWebservices,分析它的WSDL描述,并产生C#或VisualBasic源代码,您的应用程序可以使用这些代码而成为XMLWebservices的客户端。这些源代码可以创建从类库中的类派生的类,这些类使用SOAP和XML分析处理所有基础通信。虽然您可以使用类库来直接使用XMLWebservices,Web服务描述语言工具和包含在SDK中的其他工具可以使您更加方便地用.NETFramework进行开发。 最后,与托管环境中的Web窗体页相似,您的XMLWebservices将使用IIS的可伸缩通信以本机语言的速度运行。 什么是.net VisualStudio.NET是一套完整的开发工具,用于生成ASPWeb应用程序、XMLWebservices、桌面应用程序和移动应用程序。VisualBasic.NET、VisualC++.NET、VisualC#.NET和VisualJ#.NET全都使用相同的集成开发环境(IDE),该环境允许它们共享工具并有助于创建混合语言解决方案。另外,这些语言利用了.NETFramework的功能,此框架提供对简化ASPWeb应用程序和XMLWebservices开发的关键技术的访问。 7、Ref与out有什么不同? 8.值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型。 大多数编程语言提供内置的数据类型(比如整数和浮点数),这些数据类型会在作为参数传递时被复制(即,它们通过值来传递)。在.NETFramework中,这些称为值类型。运行库支持两种值类型: 用户定义的值类型:您的语言将提供各种方法来定义派生自System.ValueType的您自己的值类型。如果您想定义一个表示小值的类型,比如复数(使用两个浮点数),则可以选择将其定义为值类型,因为您可以有效地通过值来传递值类型。如果您要定义的类型通过引用传递时会更高效,则应将其定义为类。 对于每一种值类型,运行库都提供一种相应的已装箱类型,这是与值类型有着相同状态和行为的类。当需要已装箱的类型时,某些语言要求使用特殊的语法;而另外一些语言会自动使用已装箱的类型。在定义值类型时,需要同时定义已装箱和未装箱的类型。 值类型可以有字段、属性和事件。它们也有静态和非静态方法。当它们被装箱时,会从System.ValueType继承虚方法,并可实现零个或更多接口。 值类型是密封的,这意味着不能从它们派生出其他类型。但是,可以直接对值类型定义虚方法,并且既可对该类型的已装箱形式,也可对未装箱形式调用这些方法。尽管不能从一种值类型派生出另一种类型,但是当所用语言处理虚方法比处理非虚方法或静态方法更方便时,可以对值类型定义虚方法。 引用类型(referencetype) 由类型的实际值引用(类似于指针)表示的数据类型。如果为某个变量分配一个引用类型,则该变量将引用(或“指向”)原始值。不创建任何副本。引用类型包括类、接口、委托和装箱值类型。引用类型值是对该类型的某个实例的一个引用,后者称为对象。null值比较特别,它适用于所有引用类型,用来表示“没有被引用的实例”。 C#中内置引用类型: object类型在.NETFramework中是System.Object的别名。可将任何类型的值赋给object类型的变量。所有数据类型无论是预定义的还是用户定义的,均从System.Object类继承。object数据类型是同对象进行相互已装箱的类型。 string类型表示一个Unicode字符的字符串。string是.NETFramework中System.String的别名。尽管string是引用类型,但相等运算符(==和!=)被定义为比较string对象(而不是引用)的“值”(7.9.7字符串相等运算符)。这使得对字符串相等性的测试更为直观。 C#支持两种类型:“值类型”和“引用类型”的比较: 值类型包括简单类型(如char、int和float)、枚举类型和结构类型。引用类型包括类(Class)类型、接口类型、委托类型和数组类型。 值类型与引用类型的区别在于值类型的变量直接包含其数据,而引用类型的变量则存储对象引用。对于引用类型,两个变量可能引用同一对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响另一个变量。 数据类型分隔为值类型和引用类型。值类型要么是堆栈分配的,要么是在结构中以内联方式分配的。引用类型是堆分配的。引用类型和值类型都是从最终的基类Object派生出来的。当值类型需要充当对象时,就在堆上分配一个包装(该包装能使值类型看上去像引用对象一样),并且将该值类型的值复制给它。该包装被加上标记,以便系统知道它包含一个值类型。这个进程称为装箱,其反向进程称为取消装箱。装箱和取消装箱能够使任何类型像对象一样进行处理。 9.结构体是值类型还是引用类型的? 结构与类很相似,都表示可以包含数据成员和函数成员的数据结构。但是,与类不同,结构是一种值类型,并且不需要堆分配。结构类型的变量直接包含结构的数据,而类类型的变量包含对数据的引用(后者称为对象)。 结构对于具有值语义的小的数据结构特别有用。复数、坐标系中的点或字典中的“键-值”对都是结构的典型示例。这些数据结构的关键之处在于:它们只有少量数据成员,它们不要求使用继承或引用标识,而且它们适合使用值语义(赋值时直接复制值而不是复制它的引用)方便地实现。 struct类型是一种可包含构造函数、常数、字段、方法、属性、索引器、运算符、事件和嵌套类型的值类型 在类上调用“新建”(New)运算符时,它将在堆上进行分配。但是,当实例化结构时,将在堆栈上创建结构。这样将产生性能增益。而且,您不会像对待类那样处理对结构实例的引用。您将直接对结构实例进行操作。鉴于此原因,向方法传递结构时,结构将通过值传递,而不是作为引用传递。 在结构中初始化实例字段是错误的。 使用new运算符创建结构对象时,将创建该结构对象,并且调用适当的构造函数。与类不同的是,结构的实例化可以不使用new运算符。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。 对于结构,不像类那样存在继承。一个结构不能从另一个结构或类继承,而且不能作为一个类的基。但是,结构从基类Object继承。结构可实现接口,其方式同类完全一样。 结构和类的比较: VisualBasic.NET统一了结构和类的语法,结果就是两个实体都支持大多数的相同功能。但是,在结构和类之间还有着重要的区别。 结构和类在以下方面相同: 结构和类在以下方面有所不同: 每一个结构都有不带参数的隐式公共构造函数。此构造函数将结构的所有数据成员初始化为默认值。不能重定义此行为。 由于结构是值类型,每个结构变量都永久地绑定到一个单独的结构实例。但类是引用类型,对象变量可引用各种类实例。此区别在下列方面影响结构和类的使用: 10、C#中有没有静态构造函数,如果有是做什么用的? 静态构造函数是不可继承的,而且不能被直接调用。类的静态构造函数在给定应用程序域中至多执行一次。应用程序域中第一次发生以下事件时将触发静态构造函数的执行: 如果类中包含用来开始执行的Main方法,则该类的静态构造函数将在调用Main方法之前执行。如果类包含任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。 11、在C#中如何实现多态? 多态性是类为方法(这些方法以相同的名称调用)提供不同实现方式的能力。多态性允许对类的某个方法进行调用而无需考虑该方法所提供的特定实现。例如,可能有名为Road的类,它调用另一个类的Drive方法。这另一个类Car可能是SportsCar或SmallCar,但二者都提供Drive方法。虽然Drive方法的实现因类的不同而异,但Road类仍可以调用它,并且它提供的结果可由Road类使用和解释。 可以用不同的方式实现组件中的多态性: 接口和抽象类使您可以创建组件交互的定义。通过接口,可以指定组件必须实现的方法,但不实际指定如何实现方法。抽象类使您可以创建行为的定义,同时提供用于继承类的一些公共实现。对于在组件中实现多态行为,接口和抽象类都是很有用的工具。下面将更详细地讨论这三种类型的多态性。 组件编程中的一项强大技术是能够在一个对象上实现多个接口。每个接口由一小部分紧密联系的方法、属性和事件组成。通过实现接口,组件可以为要求该接口的任何其他组件提供功能,而无需考虑其中所包含的特定功能。这使后续组件的版本得以包含不同的功能而不会干扰核心功能。 其他开发人员最常使用的组件功能自然是组件类本身的成员。然而,包含大量成员的组件使用起来可能比较困难。可以考虑将组件的某些功能分解出来,作为私下实现的单独接口。 根据接口来定义功能的另一个好处是,可以通过定义和实现附加接口增量地将功能添加到组件中。优点包括: 抽象类提供继承和接口实现的功能。抽象(在VisualBasic中是MustInherit)类不能示例化,必须在继承类中实现。它可以包含已实现的方法和属性,但也可以包含未实现的过程,这些未实现过程必须在继承类中实现。这使您得以在类的某些方法中提供不变级功能,同时为其他过程保持灵活性选项打开。抽象类的另一个好处是:当要求组件的新版本时,可根据需要将附加方法添加到基类,但接口必须保持不变。 12、什么是反射?如何实现反射? 通过反射命名空间中的类以及System.Type,您可以获取有关已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。您也可以使用反射在运行时创建类型实例,然后调用和访问这些实例。 System.Reflection类中最常用的方法都使用统一的模式。Module、Type和MemberInfo类的成员使用下表中所示的设计模式。System.Type类对于反射起着核心的作用。当反射请求加载的类型时,公共语言运行库将为它创建一个Type。您可以使用Type对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。在使用Assembly.GetType或Assembly.GetTypes时传入所需类型的名称,可以从尚未加载的程序集中获取Type对象。使用Type.GetType可从已加载的程序集中获取Type对象。使用Module.GetType和Module.GetTypes可获取模块Type对象。另一个常用的设计模式是使用委托。它们通常在反射中用来支持对返回对象数组的方法的结果集进行筛选。 13.请解释流与文件有什么不同? 抽象基类Stream支持读取和写入字节。Stream集成了异步支持。其默认实现根据其相应的异步方法来定义同步读取和写入,反之亦然。所有表示流的类都是从Stream类继承的。Stream类及其派生类提供数据源和储存库的一般视图,使程序员不必了解操作系统和基础设备的具体细节。 流涉及三个基本操作: 根据基础数据源或储存库,流可能只支持这些功能中的一部分。例如,NetworkStreams不支持查找。Stream的CanRead、CanWrite和CanSeek属性及其派生类决定不同的流所支持的操作。 FileObject提供文本文件的表示形式。使用FileObject类来执行大多数典型的文本文件操作,例如读取、写入、追加、复制、删除、移动或重命名。还可以使用FileObject来检查并(在某些情况下)设置文件属性、编码和路径信息。File、FileInfo、Path、Directory和DirectoryInfo是密封类。可以创建这些类的新实例,但它们不能有派生类。 文件和流的差异: System.IO命名空间包含允许在数据流和文件上进行同步和异步读取及写入的类型。文件是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合。因此,对于文件,人们常会想到目录路径、磁盘存储、文件和目录名等方面。相反,流提供一种向后备存储器写入字节和从后备存储器读取字节的方式,后备存储器可以为多种存储媒介之一。正如除磁盘外存在多种后备存储器一样,除文件流之外也存在多种流。例如,还存在网络流、内存流和磁带流等。 14、程序集与命名空间有什么不同? 程序集是.NETFramework应用程序的生成块;程序集构成了部署、版本控制、重复使用、激活范围控制和安全权限的基本单元。程序集是为协同工作而生成的类型和资源的集合,这些类型和资源构成了一个逻辑功能单元。程序集为公共语言运行库提供它识别类型实现所需的信息。对于运行库,类型不存在于程序集上下文之外。 程序集是.NETFramework编程的基本组成部分。程序集执行以下功能: 有几种创建程序集的方法。您可以使用过去用来创建.dll或.exe文件的开发工具,例如VisualStudio.NET。您可以使用在.NETFrameworkSDK中提供的工具来创建带有在其他开发环境中创建的模块的程序集。您还可以使用公共语言运行库API(例如Reflection.Emit)来创建动态程序集。 C#程序中的若干上下文要求指定命名空间名称或类型名称。两种形式的名称都写为以“.”标记分隔的一个或多个标识符。 namespace-name:(命名空间名称:) namespace-or-type-name(命名空间或类型名称) type-name:(类型名:) namespace-or-type-name:(命名空间或类型名称:) identifier(标识符)namespace-or-type-name.identifier(命名空间或类型名称.标识符) “类型名”是一个“命名空间或类型名称”,它引用一个类型。需遵循下述的决策:“类型名”的“命名空间或类型名称”必须引用一个类型,否则将发生编译时错误。 “命名空间名称”是一个“命名空间或类型名称”,它引用一个命名空间。需遵循下述的决策:“命名空间名称”的“命名空间或类型名称”必须引用一个命名空间,否则将发生编译时错误。 “命名空间或类型名称”的含义按下述步骤确定: 否则,如果该“using命名空间指令”导入的命名空间包含多个具有给定名称的类型,则“命名空间或类型名称”就被认为是含义不清的,将导致发生错误。 15、请编写一个捕获所有错误的错误处理代码? Try{(程序代码)}catch(System.Exceptione){(错误处理代码)} 一个try块只能有一个常规catch块。不允许一个try块有多个常规catch块,否则将导致编译时错误。(常规catch块:特殊的catch块,可以扑获任何类型的异常)。 异常是程序执行时遇到的任何错误情况或意外行为。以下这些情况都可以引发异常:您的代码或调用的代码(如共享库)中有错误,操作系统资源不可用,公共语言运行库遇到意外情况(如无法验证代码),等等。对于这些情况,应用程序可以从其中一些恢复,而对于另一些,则不能恢复。尽管可以从大多数应用程序异常中恢复,但不能从大多数运行库异常中恢复。 在.NETFramework中,异常是从Exception类类继承的对象。异常从发生问题的代码区域引发,然后沿堆栈向上传递,直到应用程序处理它或程序终止。 运行库使用基于异常对象和受保护代码块的异常处理模型。发生异常时,创建一个Exception对象来表示该异常。 异常信息表对于受保护的块有四种类型的异常处理程序: 每种语言根据自己的规范实现这些异常处理程序。例如,VisualBasic.NET通过Catch语句中的变量比较(使用When关键字)提供对用户筛选的处理程序的访问;C#不实现用户筛选的处理程序。 异常发生时,运行库开始执行由下列两步组成的过程: 1.运行库在数组中搜索满足下列条件的第一个受保护块: ·保护包含当前执行的指令的区域,而且 ·包含异常处理程序或包含处理异常的筛选器。 2.如果出现匹配项,运行库创建一个Exception对象来描述该异常。然后运行库执行位于发生异常的语句与处理该异常的语句之间的所有Finally语句或错误处理语句。请注意,异常处理程序的顺序很重要:最里面的异常处理程序最先计算。还请注意,异常处理程序可以访问捕捉异常的例程的局部变量和本地内存,但引发异常时的任何中间值都会丢失。 如果当前方法中没有出现匹配项,则运行库搜索当前方法的每一个调用方,并沿着堆栈一直向上查找。如果任何调用方都没有匹配项,则运行库允许调试器访问该异常。如果调试器不能附加到该异常,则运行库引发UnhandledException事件。如果没有UnhandledException事件的侦听器,则运行库转储堆栈跟踪并结束程序。 可以按类型或按某些用户定义的条件对捕捉和处理的异常进行筛选。类型筛选的处理程序处理特定类型的异常(或从该异常派生的类)。最常见形式的类型筛选的异常处理程序指定仅捕捉特定类型的异常。 有两种类型的异常:由执行程序生成的异常和由公共语言运行库生成的异常。错误发生时,运行库引发SystemException的适当派生类。这些错误是失败的运行库检查(如数组超出界限错误)导致的,它们可在任何方法的执行过程中发生。ApplicationException由用户程序引发,而不是由运行库引发。如果设计创建新异常的应用程序,应从ApplicationException类派生那些异常。不建议捕捉SystemException,在应用程序中引发SystemException也不是好的编程做法。 程序必须能够统一处理在执行期间发生的错误。公共语言运行库提供了一个平台,以统一的方式通知程序发生的错误,这样为设计容错软件提供了极大的帮助。所有的.NETFramework操作都通过引发异常来指示出现错误。 传统上,语言的错误处理模型依赖于语言检测错误和查找错误处理程序的独特方法,或者依赖于操作系统提供的错误处理机制。运行库实现的异常处理具有下列特点: 与其他错误通知方法(如返回代码)相比,异常具有若干优点。不再有出现错误而不被人注意的情况。无效值不会继续在系统中传播。不必检查返回代码。可以轻松添加异常处理代码,以增加程序的可靠性。最后,运行库的异常处理比基于Windows的C++错误处理更快。 由于执行线程例行地遍历托管代码块和非托管代码块,因此运行库可以在托管代码或非托管代码中引发或捕捉异常。非托管代码可以同时包含C++样式的SEH异常和基于COM的HRESULT。 16.委托与事件是什么关系?为什么要使用委托? 运行库支持称为委托的引用类型,其作用类似于C++中函数指针的用途。与函数指针不同,委托实例独立于它所封装的方法的类;最主要的是那些方法与委托的类型是兼容的。另外,函数指针只能引用静态函数,而委托可以引用静态和实例方法。委托主要用于.NETFramework中的事件处理程序和回调函数。 委托是用来处理其他语言(如C++、Pascal和Modula)需用函数指针来处理的情况的。不过与C++函数指针不同,委托是完全面对对象的;另外,C++指针仅指向成员函数,而委托同时封装了对象实例和方法。 所有委托都是从System.Delegate继承而来的,并且有一个调用列表,这是在调用委托时所执行的方法的一个链接列表。产生的委托可以用匹配的签名引用任何方法。没有为具有返回类型并在调用列表中包含多个方法的委托定义返回值。 可以使用委托的Combine和Remove方法在其调用列表中添加和移除方法。若要调用委托,可使用Invoke方法,或者使用BeginInvoke和EndInvoke方法异步调用委托。委托类的实现是由运行库提供的,而不是由用户代码提供的。 委托是事件的基础,.NETFramework中的事件是基于委托模型的。 event指定一个事件: event关键字使您得以指定当代码中的某些“事件”发生时调用的委托。此委托可以有一个或多个关联的方法,当代码指示该事件已发生时将调用关联的方法。可使一个程序中的事件用于面向.NETFramework公共语言运行库的其他程序。 为了创建并使用C#事件,必须采取以下步骤: 1.创建或标识一个委托。如果正在定义自己的事件,还必须确保有与事件关键字一起使用的委托。如果已经预定义了事件(例如在.NETFramework中),则事件的使用者只需要知道委托的名称。 2.创建一个类,包含: a.从委托创建的事件。 c.调用此事件的方法。这些方法可以重写一些基类功能。 3.定义一个或多个将方法连接到事件的类。所有这些类都包括: ·使用+=运算符和-=运算符将一个或多个方法与基类中的事件关联。 ·将与事件关联的方法的定义。 4.使用此事件: ·使用定义的构造函数,创建包含事件定义的类对象。 事件委托是多路广播的,这意味着它们可以对多个事件处理方法进行引用。有关详细信息,请参见Delegate。委托考虑了事件处理中的灵活性和精确控制。通过维护事件的已注册事件处理程序列表,委托为引发事件的类担当事件发送器的角色。 b.引发事件的方法。.NETFramework类库或第三方类库中可能已经定义了事件数据类和事件委托类。 17、一个类中有几种元素? 构造函数、析构函数、常数、字段、方法、属性、索引器、运算符、事件、委托、类、接口、结构 类可以定义对象可执行的操作(方法、事件或属性),并定义保存对象(字段)状态的值。尽管类通常同时包含定义和实现,但它也可以包含没有实现的一个或多个成员。类的实例是对象。可以通过调用对象的方法并访问其属性、事件和字段,来访问对象的功能。 特征 说明 sealed 指定不能从这种类型派生出另一种类型。 implements 指出该类通过提供接口成员的实现,使用一个或多个接口。 abstract 指定不能创建类的实例。若要使用它,必须由其派生出另一个类。 inherits 指出可以在指定了基类的任何地方使用类的实例。从基类继承的派生类可以使用基类提供的任何虚方法的实现,或者派生类可以用自己的实现重写它们。 exported或notexported 指出某个类在定义它的程序集之外是否可见。仅适用于顶级类。 嵌套类也有成员特征。没有实现的类成员是抽象成员。有一个或更多抽象成员的类其本身也是抽象的;不可以创建它的新实例。以运行库为目标的某些语言允许将类标记为抽象,即使其成员都不是抽象的也是如此。当需要封装一组派生类可在适当时候继承或重写的基本功能时,可以使用抽象类。非抽象的类称为具体类。类可以实现任何数量的接口,但它只能从一个基类继承。所有的类都必须至少有一个构造函数,该函数初始化此类的新实例。 18、请解释这种语法现象Session[“name”]=20; 索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同的是它们的访问器采用参数。 属性是类、结构和接口的命名成员。它们提供了通过访问器读、写或计算私有字段值的灵活机制。属性按如下方式,根据所使用的访问器进行分类: 索引器与属性类似。除下表中显示的差别外,为属性访问器定义的所有规则同样适用于索引器访问器。 属性 索引器 通过名称标识。 通过签名标识。 通过简单名称或成员访问来访问。 通过元素访问来访问。 可以为静态成员或实例成员。 必须为实例成员。 属性的get访问器没有参数。 索引器的get访问器具有与索引器相同的形参表。 属性的set访问器包含隐式value参数。 除了value参数外,索引器的set访问器还具有与索引器相同的形参表。 19、装箱与取消装箱是什么含义? 装箱(boxing) 值类型实例到对象的转换,它暗示在运行时实例将携带完整的类型信息,并在堆中分配。Microsoft中间语言(MSIL)指令集的box指令,通过复制值类型,并将它嵌入到新分配的对象中,将值类型转换为对象。 取消装箱(unboxing) 将对象实例转换为值类型。 20、一个构造函数能否调用另一个构造函数,如果能请写出简单的代码 publicCylinder(doublereadius,doubleheight):base(radius,height){ 类构造函数也可通过关键字this调用同一个类的另一个构造函数。 PublicPoint():this(0,20){ 无参数构造函数Point()调用了另一个带有两个参数的构造函数,将默认位置初始化为(0,20)。 三种类构造函数: 类构造函数的类型 注释 实例 用于创建并初始化类的实例。 私有 在类之外不可访问的特殊类型实例构造函数。无法用私有构造函数来实例化类。 静态 在创建第一个实例或引用任何静态成员之前,将自动调用这种构造函数来初始化类。无法直接调用这种构造函数。 静态构造函数用于初始化类。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。静态构造函数既没有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。当没有实例字段或实例方法(如Math类)或调用方法以获得类的实例时,私有构造函数可用于阻止创建类。 结构构造函数类似于类构造函数,只是存在以下差异: 析构函数: 析构函数用于销毁类的实例不能对结构使用析构函数。只能对类使用析构函数。一个类只能有一个析构函数。无法继承或重载析构函数。无法调用析构函数。它们是被自动调用的。析构函数既没有修饰符,也没有参数。 创建新的执行线程 System.Threading.ThreadmyThread; 2.用线程起始点的适当委托实例化该线程。使用AddressOf运算符在VisualBasic中创建委托,或在C#中创建新的ThreadStart对象。 MyThread=newSystem.Threading.Thread(newSystem.Threading.ThreadStart(myStartingMethod));