软件工厂面试题汇总(第二版)(1)_第1页
软件工厂面试题汇总(第二版)(1)_第2页
软件工厂面试题汇总(第二版)(1)_第3页
软件工厂面试题汇总(第二版)(1)_第4页
软件工厂面试题汇总(第二版)(1)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一部分C#1) 谈谈你对面向对象的认识?答案: 面向对象是一种编程思想,也是一种设计理念。在软件编程中,面向对象有几个基本的概念,他们是:类、对象、继承、封装和多态。而正是这些元素构成了面向对象设计开发的基本逻辑。而实际上,理解面向对象一个重要的方法就是以实际的生活来类比对象世界,对象世界的逻辑和我们生活得逻辑形成对比的时候,这种体验将会更有亲切感。 面向对象的三大特征是:封装、继承、多态; 封装隐藏了类内部的具体实现细节,对外则提供统一访问接口,来操作内部数据成员。这样实现的好处是实现了UI分离,程序员不需要知道类内部的具体实现,只需按照接口协议进行控制即可。同样对类内部来说,封装保证了类

2、内部成员的安全性和可靠性。 继承,就是面向对象中类与类之间的一种关系。继承的类称为子类、派生类,而被继承类称为父类、基类或超类。通过继承,使得子类具有父类的属性和方法,同时子类也可以通过加入新的属性和方法或者修改父类的属性和方法建立新的类层次。多态分为基类继承式多态和接口实现式多态。基类继承多态的关键是继承体系的设计与实现,而接口实现式多态通过实现接口的方法约定形成继承体系,具有更高的灵活性。2) 你如何理解事件与委托的概念?答案:事件:事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交(例如鼠标单击)互引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象叫做事件发送方。捕

3、获事件并对其作出响应的对象叫做事件接收方。在中,事件与委托一起使用来实现事件处理。在实现事件时,需要个相互联系的元素:提供事件数据的类(消息)、事件委托和引发事件的类。委托:委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以理解成类型安全的函数指针。3) 类和结构的异同?答案:class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段、属性、方法、构造函数、索引器、操作符等。所有的类都最终继承自System.Object类。struct(结构)是一种值类型,用于将一组相关的信息

4、变量组织为一个单一的变量实体。所有的结构都继承自System.ValueType类,因此是一种值类型。相同点:声明语法类似;不同点:1、 class是引用类型,继承自System.Object类;struct是值类型,继承自System.ValueType类,因此不具多态性。2、 从职能观点来看,class表现为行为;而struct常用于存储数据;3、 class支持继承,可以继承自类和接口;而struct没有继承性,struct不能从class继承,也不能作为class的基类,但struct支持接口继承;4、 class可以声明无参构造函数,可以声明析构函数;而struct职能声明带参数构造

5、函数,且不能声明析构函数。因此,struct没有自定义的默认无参构造函数,默认无参构造器只是简单地把所有初始化为它们的0等价值。5、 实例化时,class要使用new关键字;而struct可以不使用new关键字,如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引用未赋值的字段会导致编译错误;6、 class可以为抽象类(abstract),可以声明抽象函数;而struct不能为抽象类,也不能声明抽象函数;7、 class可以声明protected成员、virtual成员、sealed成员和override成员;而struct不可以,但是struc

6、t可以重载System.Object的3个虚方法,Equals()、ToString()和GetHashTable();8、 class的对象复制为浅拷贝和深拷贝,必须经过特别的方法来完成复制;而struct创建的对象复制简单,直接以等号连接即可;9、 class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完成后立即自动解除内存分配;10、 作为参数传递时,class变量和struct变量有所不同;11、 实现一个主要用于存储数据的结构时,应该考虑struct;12、 Struct变量占有堆栈的空间,因此只适用于数据量相对小的场合;13、 结构数组具有更高的效率;14、 提供

7、某些和非托管代码通信的兼容性。4) 抽象类和接口的异同?答案:接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR(公共语言运行时)允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常量。抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由override方法来完成。相同点:1、都不能被直接实例化,都可以通

8、过继承实现其抽象方法;2、都是面向抽象变成的技术基础,实现了诸多的设计模式;不同点:1、接口支持多继承;抽象类不能实现多继承。严格意义上说,接口继承类应该称为类实现接口;2、接口职能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员;3、接口是一组行为规范;抽象类是一个不完全的类,着重族的概念;4、接口可以用于支持回调;因为继承不支持,所以抽象类在实现回调时有局限性。5、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法;6、接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,struct就可以继承接口,而不

9、能继承类。5) 装箱于拆箱的基本概念?答案:宏观解释,从类型转换角度来说,装箱与拆箱是值类型与引用类型之间的桥梁,实现二者之间的自由转换,将类型系统统一化处理。具体来讲:装箱与拆箱,就是值类型与引用类型的转换,装箱就是值类型数据转换为无类型的引用对象,使得我们可以将值类型视为对象来处理,通常这种转换主要指转换为System.Object类型或者该值类型实现的任何借口引用类型;而拆箱就是引用类型转换为值类型,通常伴随着从堆中复制对象实例的操作。微观解释,从内存执行角度来说,值类型的内存分配于线程的堆栈上,而引用类型的内存分配于托管堆。所以从值类型向引用类型的转换,势必牵涉到数据的拷贝与指针引用等

10、操作。具体来讲:装箱操作,在托管堆中对栈中的值类型进行对象封装化处理,也就是生成一份值类型的对象引用副本,大致的过称谓:在托管堆中分配新创建对象的内存,并将值类型的字段拷贝到内存中,然后返回新对戏那个的地址,这样就完成了将值类型转变为引用类型的过程;而拆箱操作,就是获取已封装对象中来自值类型部分字段的地址。所以装箱和拆箱并非对称的互逆操作,拆箱在执行上并不包含字段的拷贝过程。6) 值类型与引用类型的区别?答案:值类型(Value Type),值类型实例通常分配在线程的堆栈(Stack)上,并且不包含任何指向实例数据的指针,因为变量本身就包含了其实例数据。其在MSDN的定义为:值类型直接包含他们

11、的数据,值类型的实例要么在堆栈上,要么内联在结构中。值类型主要包括简单类型、结构体类型和枚举类型等。通常声明为以下类型:int、char、float、long、bool、double、struct、enum、short、byte、decimal、sbyte、unit、ulong、ushort等时,该变量即为值类型。引用类型(Reference Type),引用类型实例分配在托管堆(managed heap)上,变量保存了实力数据的内存引用。其在MSDN中的定义为:引用类型存储对值的内存地址的引用,位于堆上。引用类型可以是自描述类型、指针类型或接口类型。而自描述类型进一步细分为数组和类类型。类类

12、型可以是用户定义的类、装箱的值类型和委托。通常声明为以下类型:class、interface、delegate、object、string以及其他的自定义引用类型时,该变量即为引用类型。7) 进程与线程的区别?答案:进程就是计算机中正在执行的程序(即处于活动状态的程序),每一个进程都有自己独立的一块内存空间和一组系统资源。线程和进程有很多相似的特征,线程可以被看作是进程的进一步细分,也就是把进程完成的任务划分成一个个更小的子任务,每一个子任务就是一个线程,然后用细分的这些线程分别去执行。线程是基于进程的一个级别运行单位,线程同样包括一个内存入口地址、一个出口地址以及能够执行的代码序列。但是线程

13、和进程的根本区别在于线程不能够单独执行,它必须运行在处于活动状态的进程中。8) 方法覆写(重写)与方法重载的异同?答案:覆写,又称重写,就是在子类中重复定义父类方法,提供不同实现,存在于有继承关系的父子关系中。当子类重写父类的虚函数后,父类对象就可以根据赋予它的不同子类指针动态调用子类的方法。重载,就是在同一个类中存在多个同名的方法,而这些方法的参数列表和返回值类型不同。值得注意的是,重载的概念并非面向对象编程的范畴,从编译器角度理解,不同的参数列表、不同的返回值类型,就意味着不同的方法名。也就是说,方法的地址,在编译器就已经确定,这是一种静态绑定。9) 谈谈C#中访问修饰符有哪些,有何的异同

14、?答案:共有五个,public、protected、internal、protected internal、privatepublic:访问成员没有限制,属于最高级别访问权限;protected:包含类或者从包含类派生的类可以访问;internal:程序集类型,在相同的命名空间内可以访问;protected internal:访问仅限于从包含类派生的当前程序集或类型。也就是同一个程序集的对象,或者该类及其子类可以访问;private:私有类型,只有当前类自身可以访问;10) C#中using的作用和不同用法有哪些?答案:(1)引入命名空间; 映入命名空间的用法规则为: using Namesp

15、ace;(2)为命名空间创建别名; 为命名空间创建别名的用法规则为: using alias = namespace | type;(3)强制资源清理;实例化对象时用using修饰对象,在代码执行到using块结束时,自动释放由using修饰的对象资源;11) 堆与栈的异同?答案:堆和栈的区别可以用如下的比喻来看出:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。堆和栈的区别主要分:操作系统方面的

16、堆和栈,如上所述。还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。 虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。12) 属性与索引器的概念?答案:属性:通过名称标识。通过简单名称或成员访问来访问。可以为静态成员或实例成员。属性的get访问器没有参数。属性的set访问器包含隐式的value参数。索引器:通过签名标识。通过元素访问来访问。必须为实例成员。索引器的get访问器具有与索引器相同的形参表。除了value参数外,索

17、引器的set访问器还与索引器相同的形参表。13) 序列化与反射的概念以及他们各自的作用?答案:反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。14) 谈谈对托管代码与非托管代码的理解?答案:以运行库为目标的代码称为托管代码,而不以运行

18、库为目标的代码称为非托管代码。在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。COM 组件、ActiveX 接口和 Win32 API 函数都是非托管代码的示例。15) .NET中的垃圾收集机制是什么?答案:GC(Garbage Collection)垃圾回收器16) 谈谈你对访问关键字的认识?(this、base)答案:base关键字常用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限于构造函数、实例方法和实例属性访问器中,MSDN小结其具体功能包括:调用基类上已被其他方法重写的方法;制定创建派生类实例时应调用的基类构造函数。this关键字常用于

19、引用类的当前实例,也包括继承而来的方法,通常可以隐藏this,MSDN小结其具体功能主要包括:限定被相似的名称隐藏的成员;将对象作为参数传递到其他方法;声明索引器。17) 常用的集合对象有哪些?各有什么特点?答案:Array、ArrayList、HashTable、List、Dictionary。Array是抽象类,不能直接实例化;ArrayList的长度是可变的;HashTable可以动态维护长度,而且可以通过关键字进行搜索;List是类型安全的集合对象;Dictionary也是类型安全的集合对象;18) 谈谈const与readonly的区别?答案: const默认是静态的,只能由类型来访

20、问,不能和static同时使用,否则出现编译错误;readonly默认是非静态,由实例对象来访问,可以显式使用static定义为静态成员。const只能应用在值类型和string类型上,其他引用类型常量只能定义为null,否则以new为const引用类型常量赋值,编译器会引发“只能用null对引用类型(字符串除外)的常量进行初始化”错误提示,原因是构造函数初始化是在运行时,而非编译时;readonly只读字段,可以使任意类型,但是对于引用类型字段来说,readonly不能限制使该对象实例成员的读写控制。const必须在字段声明时初始化;而readonly可以在声明时,或者函数中进行初始化,不同

21、的构造函数可以为readonly常量实现不同的初始值。const可以定义字段和局部变量;而readonly则只能定义字段。const定义时必须初始化;而readonly定义时可以不进行初始化,但是微软强烈建议在定义时进行初始化操作,否则CLR将根据其类型赋予默认值。数据和结构体不能声明为const变量,string类型可以被声明为常量,其源于string类型的字符串恒定特性,使得string的值具有只读特性。从应用角度来看,对于恒定不变且单独使用的量来说,应该考虑声明为const变量,例如圆周率、性能比、折扣率、百分比等;而对于可能随实际运行发生变化的量,应该考虑声明为readonly常量,例

22、如日期或时间,数据库中的主键ID等。19) String与StringBuilder的区别?答案:String对象是不可变的,它有固定长度,每次使用它的时候,我们都要从内存中重新分配空间给他,如果我们重复修改它,那么内存开销是比较大的。比如 string x=“”;x = “a” + “b” + “c”;最后x的值为“abc”,其实这个x已经不是原来的那个x,内存已经为它重新分配了空间。如果我们要修改字符串而不创建新的对象,则可以使用 StringBuilder 。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能。虽然 StringBuilder对象

23、是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前 StringBuilder对象容纳的字符串长度混淆在一起。例如,可以创建 StringBuilder类的带有字符串“Hello”(长度为 5)的一个新实例,同时可以指定该对象的最大容量为25。当修改 StringBuilder时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定 StringBuilder类的容量。下面的示例指定可以将 MyStringBuilder 对象扩充到最大 25 个空

24、白。比如:StringBuilder MyStringBuilder = new StringBuilder(Hello World!, 25);我们也可以通过Capacity 属性来设置对象的最大长度。比如:MyStringBuilder.Capacity = 25;20) C#如何读取XML文件?答案: 使用XMLDocument对象的Load方法。如下:XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(Server.MapPath(XMLFile.xml);第二部分:ADO.NET1)ADO.NET的主要对象有哪些,谈谈你对他们的认识。

25、答案: (1)Command用于对数据库操作的命令对象(2)Connection 表示与数据库连接对象;(3)DataAdapter用于充当数据库和ADO.NET数据库模型中断开式连接的适配器;(4)DataSet断开式操作时的内存数据集合,中可以存储多张表等;(5)DataReader对象只能实现对数据的读取,不能完成其他的操作;2)DataSet与DataReader的区别。(断开模式与非断开模式的区别)答案:(1)DateSet是数据在内存中的缓存,是保存数据的数据结构,断开模式;(2)DataReader不承担保存数据的责任,需要自己手动关闭连接数据库,它只负责从数据源读取数据到本地而

26、已,是只读向前的,它不是数据结构3).NET Framework 2.0中,包含了几种数据访问的提供者,分别有哪些。答案:(1)SqlClient:sql server数据库提供者;(2)OleDb: Access数据库提供者;(3)Odbc 通过Odbc驱动与数据库进行操作;(4)OracleClient: Orcale数据库提供者;4)Command对象的常用方法有哪些,他们之间的区别有什么?(ExecuteNonQuery、ExecuteReader)答案:(1)ExecuteNonQuery(),ExecuteReader(),ExecuteScalar();(2)ExecuteNon

27、Query()此方法用来执行增加(insert),删除(delete),修改 (update)数据用,返回被sql语句影响的行数。在存储过程中遇到set nocount on时返回默认值,修改表中有触发器时,返回结果和实际结果不同。 (3)ExecuteReader()此方法用来读取表中数据,仅向前,速度比较快(相对于dataAdapter)。(4)ExecuteScalar()此方法用来读取select语句中返回的第一行第一列的值,返回值是object类型,注意思数据类型转换。5)数据源组件的主要作用?(SqlDataSource的作用)答案:SqlDataSource组件是一种数据源控件,

28、它可以连接到任何ADO.NET支持的数据源(如SQL Server、Oracle等),从中检索数据,并使得其他控件(如GridView等控件)可以绑定到数据源。使用SqlDataSource组件访问数据,只需要提供用于连接到数据库的连接字符串,并定义访问数据的SQL语句或存储过程。在运行时,SqlDataSource组件会自动打开与数据库的连接,执行SQL语句或存储过程,完成数据访问后自动关闭连接。6).Net中常用数据库的链接字符串的写法?(SQL SERVER、Oracle等)答案:(1)SQL SERVER 连接字符串: “server=.;uid=sa;pwd=sql;database

29、=Northwind”或者“Data Source=.;Initial Catalog=Northwind;User ID=sa;Password=sql”(2)Orcale:连接字符串:Data Source=TORCL;User Id=myUsername;Password=myPassword; (3)Access:连接字符串:(Provider=Microsoft.Jet.OLEDB.4.0;DataSource=D:MyWeb8105GrocerToGo.mdb”)7)对数据库连接池的认识?答案:连接池是一种在打开数据存储区的连接时提高应用程序性能的机制;在调用SqlConnecti

30、on对象的Close方法时,Sql Client.Net数据提供者程序并不实际关闭内部连接;相反,数据提供者将该内部连接存储到一个池中。甚至在SqlConnection对象被处理后,该内部链接也不留在池中;如果再次使用同样的连接时,只要调用SqlConnection对象的Open方法,就会再一次使用同一连接;8)使用ADO.NET技术如何优化系统性能?答案:一、数据库连接打开和关闭在需要连接时打开,当访问完数据库要立刻关闭连接。二、数据库查询1、直接生成SQL语句。Sql Server每次都要对其进行编译,在性能方面不会有很大的提高。另外也不够安全,容易被攻击。2、使用带参数的SQL命令。这种

31、方式Sql Server只对其编译一次,对于不同的参数可以重复使用编译后的命令,提高了性能。3、使用Sql Server存储过程。编译一次,具有独立性,便于修改和维护。一次能完成用语句发送多次的功能,减少了网络的流量。 并不一定存储过程一定比语句效率要高,如果商业逻辑很复杂的话,有时候用语句比存储过程效率要高。第三部分:ASP.NET1)谈谈你对MVC模型的认识?答案: MVC(Model View Controller)是一种较为广泛的结构设计方式,MVC设计将一般的应用程序根据功能不同,划分为三个主要的部分,它们分别是模型,视图,控制器。 所谓模型,就是在MVC中需要被显示的数据,在通常情

32、况下,该模型需要从数据库中读取数据,保存模型的状态等,提供数据的访问方法及数据维护。 所谓视图,就是用来显示模型中数据的用户界面,简单的说就是HTML页面。 所谓控制器,就是用来处理用户输入或者交互命令,以便改变模型状态,选择适当的 视图来显示对应的模型数据。2)页面传值方式有哪些?答案:(1)使用QueryString变量: QueryString是一种非常简单也是使用比较多的一种传值方式,但是它将传递的值显示在浏览器的地址栏中,如果是传递一个或多个安全性要求不高或是结构简单的数值时可以使用这个方法:连接进行跳转服务器端跳转:Response.Redirect( target.aspx?pa

33、ram1=hello¶m2=hi ) 接收页面: string str = Request.QueryStringparam1; string str1 = Request.QueryStringparam2;(2)使用Cookie对象(Cookie是存放在客户端的小量信息),它由网络服务器发送出来,存储在网络浏览器上,当用户下次访问站点时,可以根据检测该浏览器获得这些信息设置Cookie: Response.CookiesCookies的名称.Value = 变量名; /写入CookieString 变量名Request.CookiesCookie的名称.Value /读取 Cook

34、ie(3)使用Session变量(session是存放在服务器端的) Session对象存储在服务器端,针对一个连接服务器会自动分配一个ID来标识每一个不同的用户,当用户访问weby应用程序的时候,Session可以提供变量可以在该用户访问的web应用的所有页面中共享 设置Session: Session“Session 名称” = 值; 获取Session: 变量 = Session“Session 名称”;(4)使用Application 对象变量 Application对象的作用范围是整个应用程序,用来在所有用户间共享信息。此种方法不常使用,因为Application在一个应用程序域范围

35、共享,所有用户可以改变及设置其值,故只应用计数器等需要全局变量的地方。 设置Application: Application “Application名称” = 值; 获取Application: 变量 = Application “Application名称”;(5)PostBackUrl属性使用PostBackUrl属性的控件只有Button,LinkButton,ImageButton三种,才能实现跨页面传递。(6)使用Server.Transfer方法:服务器只向另一页传递上下文即可。其优点是您可以共享页之间的页上下文信息。其缺点是用户的浏览器不知道在进行传输,因此不更新浏览器的历史记

36、录。如果用户刷新此页,则可能会产生意外的结果。特征:将控件传输到在源页位置呈现的新页中。仅重定向到与源页位于相同的 Web 应用程序中的目标页。使您能够从源页读取值和公共属性。不会用目标页的相关信息来更新浏览器信息。在浏览器中按“刷新”或“后退”按钮可能导致意外行为。用法:用于条件导航,在需要控制何时导航和需要访问源页的上下文时使用。该选项最适合在对用户隐藏 URL 的情况下使用。3)ASP.NET页面的生命周期?(页面加载和触发事件的顺序)答案:常规页生命周期阶段 (1)页面请求:页请求发生在页生命周期开始之前。用户请求页时,ASP.NET 将确定是否需要分析和编译页(从而开始页的生命周期)

37、,或者是否可以在不运行页的情况下发送页的缓存版本以进行响应。 (2)开始:在开始阶段,将设置页属性,如 Request 和 Response。在此阶段,页还将确定请求是回发请求还是新请求,并设置 IsPostBack 属性。此外,在开始阶段期间,还将设置页的 UICulture 属性。 (3)页初始化:页初始化期间,可以使用页中的控件,并将设置每个控件的 UniqueID 属性。此外,任何主题都将应用于页。如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。(4)加载:加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。(5)验

38、证:在验证期间,将调用所有验证程序控件的 Validate 方法,此方法将设置各个验证程序控件和页的 IsValid 属性。(6)回发事件处理:如果请求是回发请求,则将调用所有事件处理程序。(7)呈现:在呈现之前,会针对该页和所有控件保存视图状态。在呈现阶段中,页会针对每个控件调用 Render 方法,它会提供一个文本编写器,用于将控件的输出写入页的 Response 属性的 OutputStream 中(8)卸载:完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。此时,将卸载页属性(如 Response 和 Request)并执行清理。3)ViewState的概念与作用是什么,谈谈

39、你对它的认识?答案: ViewState也称为视图状态,ASP.NET使用ViewState这种机制来跟踪服务器控件状态值,否则这些值将不作为WEB窗体的一部分而回传。即页面中的控件被编程或用户填值等方式改变了状态后,当页面发生回传,这些状态仍然可以保持。因此,除了可以减少烦琐的工作和代码外,ViewState还可以减少数据库的读取频率。 在*.aspx页面中,如果form元素的“runat”属性值为“server”(这是VS 2005/VS 2008创建ASP.NET页面时的默认设置),该页面所生成的HTML页面即具备了ViewState的功能。ViewState具体表现为form元素中被添

40、加一个隐藏的“id”属性为“_VIEWSTATE”的隐藏字段,这个字段中存放了所有控件在ViewState中的状态值。这个隐藏字段中的数据是64位编码的字符串,包含了一个集合,该集合中保存了当前页面上所有服务器控件的名称/值对,编程者可以编程通过ViewState访问这些值。 注意:ViewState不负责存储TextBox、Checkbox、CheckBoxList、RadioButtonList等这些实现了IPostBackDataHandler接口的控件所更改的状态值。在页面周期中的初始化过程(即Page_Init()事件后)中,在LoadViewState的事件中Page类从“id”属

41、性为“_VIEWSTATE”的字段中为诸如启用了ViewState的控件装载值。紧接着,LoadPostBackData事件被触发,Page类从HTTP提交的头部信息中装载实现了IPostBackDataHandler接口的控件(如TextBox)状态值。当TextBox控件的“TextMode”属性为Password时,无法保存状态值(安全需要)。 如果页面仅用于回传,则页面内自定义的其他数据也可以存储于“id”属性为“_VIEWSTATE”的隐藏字段中。编程者只需直接访问ViewState属性即可,该属性返回了System.Web.UI.StateBag类对象的访问,可利用该对象的索引器以

42、名称/值对的方式存取自定义数据。 ViewState用于保存页面中所有控件的回传时的状态数据,使WebForm程序类似于WinForm程序一样工作。ViewState可以在控件级别,页面级别,程序级别及全局配置中设置ViewState是否禁用,ViewState默认是启用的。 在解答中还提及了禁用ViewState多种方法,不同方法对应着不同的禁用范围。除了以上例子中直接在服务器控件标签中设置“EnableViewState”属性为“false”,还可以在Page指令中设置这个属性以达到页面级禁用ViewState的目的。禁用整个WEB应用程序ViewState,修改Web.config中相应

43、元素的属性即可,最后,禁用服务器全局的ViewState,修改.Net Framework安装目录下的machine.config即可。当禁用了ViewState以后,控件还可以通过control state(控件状态)保存状态数据,该属性一般用于自定义控件。 说明:ViewState只在页面内有效,不能跨页面使用。4)ASP.NET页面间的跳转方式有哪些,有何异同?答案:(1)标签: 这是最常见的一种转向方法;(2)HyperLink控件:A 服务器端控件属性NavigateUrl指定要跳转到的Url地址NavigateUrl是可以在服务器端使用代码修改,这个区别于由于HyperLink本身

44、没有事件所以要在服务器端其它事件中设置NavigateUrl(3)Response.Redirect()方法: 过程:发送一个Http响应到客户端,通知客户端跳转到一个新的页面,然后客户端再发送跳转请求到服务器端。页面跳转之后内部控件保存的所有信息丢失,当A跳转到B,B页面将不能访问A页面提交的数据信息。使用这个方法使用这个方法跳转后浏览器地址栏的Url信息改变 可以使用Session Cookies Application等对象进行页面间的数据传递重定向操作发生在客户端,总共涉及到两次与Web服务器的通信: 一次是对原始页面的请求,另一次是重定向新页面的请求 (4)Server.Transf

45、er()方法:实现页面跳转的同时将页面的控制权进行移交,页面跳转过程中Request Session等保存的信息不变,跳转之后可以使用上一个页面提交的数据,跳转之后浏览器地址栏的Url不变,这种方法的重定向请求是在服务器端的进行的,浏览器不知道页面已经发生了一次跳转(5)Server.Execute()方法:该方法允许当前页面执行同一个Web服务器上的另一个页面,页面执行完毕之后重新回到原始页面发出Server.Execute()的位置。这种方式类似针对页面的一次函数调用 被请求的页面可以使用原始页面的表单数据和查询字符串集合,被调用页面的Page指令的EnableViewStateMac属性

46、设置为False(6)JavaScript:string str = history.go(-2); Response.Write(document.location.href=ProjectAddList.aspx;)话题相关:(1)为了确保HTML输出的合法性 最好使用Response.Redirect方法;因为 Server.Execute 或者Server.Transfer方法返回给客户端的页面包含多个标记,不是合法的HTML页面,在非IE浏览器中可能会发生错误。(2)由于Server.Transfer在服务器端执行重定向,所以避免了不必要的网络通信,从而获得了更好的性能和浏览效果(3

47、)当需要把用户跳转到另一台服务器上的页面的时候 ,使用Redirect(4)当需要把用户跳转到非aspx页面时候,如html,使用Redirect(5)需要把查询字符串作为url一部分传给服务器的时候,使用Redirect,因为其他两种方法不能做到2次postback,把数据带回服务器(6)需要aspx页面间的转换(不涉及登录),使用Transfer(7)当需要把aspx页面的输出结果插入到另一个aspx页面的时候使用 Execute。(8)当需要用户来决定什么时候跳转页面,就使用超链接。(9)要用程序来控制转换的目标,但转换的时机由用户决定,使用Web服务器的HyperLink控件,动态设置

48、其NavigateUrl属性。5)谈谈你对C/S与B/S的认识,它们各有何优缺点?答案:C/S:即客户机/服务器网,Client/Server。在客户机/服务器网络中,服务器是网络的核心,而客户机是网络的基础,客户机依靠服务器获得所需要的网络资源,而服务器为客户机提供网络必须的资源。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到 Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业

49、务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。一、C/S架构软件的优势与劣势 (1)应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定

50、的规则作出应答,送回结果,应用服务器运行数据负荷较轻。 (2)数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓

51、库,它受到独立的专门管理。(3)C/S架构的劣势是高昂的维护成本且投资大。首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。(4)其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代

52、价高和低效率已经不适应工作需要。在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战。B/S: B/S结构(Browser/Server结构)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。以目前的技术看,局域网建立B/S结构的网络应用,

53、并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全。B/S架构管理软件更是方便、快捷、高效。一、B/S架构软件的优势与劣势(1)维护和升级方式简单。目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构

54、的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。(2)成本降低,选择更多。大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作

55、系统上windows并不是处于绝对的统治地位。 现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。(3)应用服务器运行数据负荷较重。由于B/S架构管理软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑

56、在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发生服务器“崩溃”等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。二、B/S、C/S结构软件技术上的比较 C/S结构软件(即客户机/服务器模式)分为客户机和服务器两层,客户机不是毫无运算能力的输入、输出设备,而是具有了一定的数据处理和数据存储能力,通过把应用软件的计算和数据合理地分配在客户机和服务器两端,可以有效地降低网络通信量和服务器运算量。由于服务器连接个数和数据通信量的限制,这种结构的软件适于在用户数目不多的局域网内使用。国内目前的大部分ERP(财务)软件产品即属于此类结构。B/S(浏览器/服务器模式)是随着Internet技术的兴起,对C/S结构的一种改进。在这种结构下,软件应用的业务逻辑完全在应用服务器端实现,用户表现完全在Web服务器实现,客户端只需要浏览器即可进行业务处理,是一种全新的软件系统构造技术。这种结构更成为当今应用软件的首选体系结构。e通管理系列产品即属于此类结构。(1)数据安全性比较。由于C/S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论