博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 面试题大全
阅读量:7099 次
发布时间:2019-06-28

本文共 34375 字,大约阅读时间需要 114 分钟。

hot3.png

面向对象的思想主要包括什么?

继承 多态 封装
● 封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
● 继承:子类拥有父类的所有数据和操作。
● 多态:一个程序中同名的不同方法共存的情况
有两种形式的多态– 重载与重写。

重写(override)与重载(overload)

相似:他们都是重新定义一个方法的实现过程
区别:
重写(override):是指对象之间的某个方法的重新实现,在一个类继承一个类时,当基类中某方法申明为virtual或abstract时,在派生类中使用override关键字重新申明一个方法,注意该方法必须与基类中的参数返回值一样,一个类中对于基类某方法只能重写一次,调用基类还是派生类的实现是通过所定义的对象的类型来决定,和方法的参数无关
 
重载(overload):指对象中某个方法的重新实现,方法重载不需要关键字,只需要申明方法的参数类型或个数不一样即可,重载不能根据返回类型不同来重载,重载可以重载任意多次,没有限制.调用哪个重载方法只和调用时的参数有关系

什么是ASP.net中的用户控件

用户控件就是.ascx扩展名的东西,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整.
问这样的问题,一般是迷惑你.因为新手还是分不清楚用户控件和服务器控件(也称自定义控件)..用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类似ASP中的include..但是功能要强大的多..
用代码生成的是自定义控件
 
在C#中,string str = null 与 string str = “”的区别。
答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间
 

请详述在dotnet中类(class)与结构(struct)的异同

Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的.
 

DataReader和DataSet的异同

DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection的操作都会引发DataReader的异常..因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader的特殊性和高性能.所以DataReader是只进的..你读了第一条后就不能再去读取第一条了..
DataSet则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接..因为DataSet将数据全部加载在内存中.所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作.
 

C#中的接口和类有什么异同

接口和类都是类,不同的事,接口只包含方法或属性的声明,不包含具体实现方法的代码,接口可以实现多继承,而类只能是单继承,继承接口的类必须实现接口中声明的方法或属性。接口主要定义一种规范,统一调用方法,在大型项目中接口正发挥日益重要的作用
类是方法功能的实现和集合,接口是规范类.约束类.
接口,是可以多继承,类只有单继承.接口强调了你必须实现,而没有具本实现的方法和虚类有点相似
 

Override与重载有什么区别?

一个是重写父类函数,一个是同一个函数的几种形式
 

<%# %> 和 <% %> 有什么区别?

<%# %>表示绑定的数据源
<% %>是服务器端代码块
 

常见的设计模式

抽象工厂模式、适配器模式、外观模式 command命令模式,桥接模式,组合模式,装饰模式,状态模式,备忘录模式等。 
软件设计模式太多,就我的理解简单说一下最常见的MVC模式。 
MVC模式是1996年由Buschmann提出的: 
模型(Model):就是封装数据和所有基于对这些数据的操作。 
视图(View):就是封装的是对数据显示,即用户界面。 
控制器(Control):就是封装外界作用于模型的操作和对数据流向的控制等。

什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?

应用程序域是一个.net framework提供的执行托管代码的环境。这个环境是提供了一个隔绝的不可卸载的安全边界。你可以在一个应用程序域里加载装配件或可执行程序。并且一个应用程序域运行出错了,可以卸载掉而不用担心影响其他应用程序域的工作。
 
托管代码是为面向公共语言运行库的服务编写的代码。
 
强类型系统是对数据类型有严格的要求和限制,每一个变量和每一个表达式都有类型,在使用一个变量前系统都会进行类型检查。
 
简单的说装箱就是将值类型转换成引用类型,而拆箱刚好是相反的过程。 重载就是对于同名函数赋予不同的参数列表,以适应同的访问需求:如 void Output(string name) {} void Output(string name, int start) {}
 
 CTS:公共类型系统.主要是为了语言之间的进行标准化处理.
 CLS:公共语言规范.主要是确保代码可以在任何语言中访问的最小标准集
 CLR:公共语言运行时.主要是管理代码..处理,加载代码,以及所有服务的代码
 

列举一下你所了解的XML技术及其应用

Xslt config XSD Web Service
 

值类型和引用类型的区别?写出C#的样例代码。

在dotnet中有两大类数据类型,即值类型和引用类型,值类型存贮在栈中,而引用类型存贮在动态的堆中,栈是先进先出的有系统管理的空间,而堆是由应用程序控制的可随时申请和释放该空间,在Donnet中一般情况下有垃圾收集器处理,他们的不同导致在编程上的不同。
        例:                     StringBuilder a=new StringBuilder();//将StringBuilder的一个首地址传给a
                                     StringBuilder b=a;//将StringBuilder的一个首地址传给b
                                      b.Append("mxh");
                                      Console.WriteLine(a);
                                       a=null;
                                       Console.WriteLine(b);
               输出结果:mxh
                                   mxh
       "a=null"的意思是:a的引用置为空但此时StringBuilder的堆空间并没有被释放,因此在此之后,输出b时,仍然可以输出mxh  
 

ADO.net中常用的对象有哪些?分别描述一下

ADO.NET的对象主要包括:DataSet,DataTable,DataColumn,DataRow,和DataRelation。
DataSet:这个对象是一个集合对象,它可以包含任意数量的数据表,以及所有表的约束、索引和关系。所有这些信息都以XML的形式存在,我们可以处理、遍历、搜索任意或者全部的数据。
DataTable:这个对象代表着可以在DataSet对象内找到的所有表
DataColumn:表包含与列有关的信息,包括列的名称、类型和属性。我们可以按照下面的方式创建DataColumn对象,指定数据类型,然后把列加入到表
DataRow:要填充一个表,我们可以使用命令的自动数据绑定功能,或者也可以手工添加行
DataRelation:这个对象代表着两个表之间的父-子关系。关系建立在具有同样数据类型的列上
  DataSet对象:表示内存中数据的缓存,可以把它想像成一个临时的数据库,它里可以存多个表(DataTable),而且是断开式的,不用每进行一次操作就对数据库进行更新,从而提高了效率。
   DataReader对象:它与DataSet最大的不同是有连接式的,每次对数据库进行存取都会影响到数据库。
   Connection对象:用于连接数据库的对象,表示到数据源的一个唯一的连接。
   Command对象:表示要对数据库执行的一个SQL语句或一个存储过程。
   DataAdapter对象:该对象是与DataSet配合使用的对象,用于把表填充到DataSet,和更新DataSet等
 
 

如何理解委托?

是c#中的一种引用类型,类似于c/c++中的函数指针。与函数指针不同的是,委托是面向对象、类型安全的,而且委托可以引用静态方法和实例方法,而函数指针只能引用静态函数。委托主要用于   .net   framework   中的事件处理程序和回调函数。  
    c#中的委托和指针不一样,指针不通过msil而是直接和内存打交道,这也是指针不安全的原因所在,当然也是采用指针能够提高程序运行速度的缘故;委托不与内存打交道,而是把这一工作交给CLR去完成. 。
 

.net中读写数据库需要用到哪些类?他们的作用

Connection DataAdapter DataSet Command DataReader

//如下是将DB的数据放到DataTablepublic DataTable SelSQL(String SQL)        {            DataTable Table = new DataTable();            SqlConnection myCon = new SqlConnection(LinkStr);  //Linestr为连接路径            SqlCommand myCom = new SqlCommand(SQL, myCon);            myCom.CommandTimeout = 0;            SqlDataAdapter Adapter = new SqlDataAdapter(myCom);            try            {                Adapter.Fill(Table);                return Table;            }            catch (SqlException e)            {                MessageBox.Show(e.Message);                return Table;            }            finally            {                myCom.Dispose();            }        } 

UDP连接和TCP连接的异同

TCP和UDP协议制订的目的是不同的,两种协议的设计初衷在不同的P2P应用环境中适用性也是不尽相同。TCP协议强调的是准确性和链路可靠,为保障建立可靠的虚拟链路在传输过程会消耗较多的资源,这也决定了在TCP在复杂网络环境中的传输性能提升和资源消耗控制方面存在很大的局限性,因此基于TCP的P2P应用更适用于文件下载类对数据准确性要求比较高的P2P应用,而UDP协议TCP的主要区别在于UDP不一定提供可靠的数据传输,而目标是尽快地传输尽可能多的信息时,其中任意给定数据的重要性相对较低。而在视音频流媒体应用中少数的数据丢失对于用户的体验来说是完全可以接受的
 

ASP.net的身份验证方式有哪些?分别是什么原理?

window验证:为每个用户开启window帐号,验证其身份.安全性较高.
forms验证:为每个登陆用户写入一个身份验证票据..在web使用最广的验证方式..灵活方便.
 

进程和线程分别怎么理解?

说法一:

线程(Thread)与进程(Process)二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。而同一进程中的不同线程共享代码和数据空间。用一个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个成员就是线程,家庭中的每个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也可以派出几个成员来协同完成,而家庭之外的人则没有办法直接消费不属于自己家庭的财产。

说法二:

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行

说法三:

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

说法四:

多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。用过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程和线程有什么区别呢?
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:
线程的划分尺度小于进程,使得多线程程序的并发性搞。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。
C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括:
●进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;
●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;
●从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。
在Unix操作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)。

说法五:

应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址,在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。
Java语言中定义的线程(Thread)同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。
Unix操作系统和Microsoft Windows操作系统支持多用户、多进程的并发执行,而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行,操作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程,子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文(Context)。
基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等方面非常廉价。
线程需要操作系统的支持,不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起,提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中,将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里,然后开始做菜。等菜做好了,饭熟了同时衣服也洗好了。
需要注意的是:在应用程序中使用多线程不会增加 CPU 的数据处理能力。只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。
 
 

什么是code-Behind技术。

新建一个VS.NET下的项目..看到ASPX,RESX和CS三个后缀的文件了吗??这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理.
 

活动目录的作用。

活动目录是window2000的最重要的功能.可以将用户信息全部集成起来,登陆以后可以访问多个不同的网络服务..
 

windows服务

Windows Service 是一种可随 Windows 操作系统启动而启动的,在后台运行的,通常不和用户产生交互的程序。它无法通过双击来运行,类似于 Unix 守护进程(daemon processes),当用户注销时它也不会停止。
Windows 服务由三部分组成:1.一个服务可执行文件;2.一个服务控制程序(SCP);3.服务控制管理器(SCM),负责在 HKLM"SYSTEM"CurrentControlSet"Services 下创建服务键值。用户可通过 SCP 控制服务的启动、停止、暂停等,SCP 会通过 SCM 调用服务程序。
Window 标准的exe可执行程序通常有一个用户界面,Console或GUI,通常由用户来启动或停止。
Windows服务是运行在windows后台指定用户下(默认System)的应用程序,它没有标准的UI界面,想比标准的EXE程序,Windows服务是在服务开始的时候创建,而在服务结束的时候销毁,而且可以设置服务是否与操作系统一起启动,一起关闭。它支持三种方式:1)自动方式 2)手动方式 3)禁用 。自动方式的时候,windows服务将在OS启动后自动启动运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被启动。另外标准的EXE默认使用的当前登录的用户,而windows服务则默认使用System用户,这在对系统资源访问的时候特别需要注意。
 
 

解释一下UDDI、WSDL的意义及其作用。

 UDDI(统一描述、发现和集成协议)计划是一个广泛的,开放的行业计划,它使得商业实体能够 (1) 彼此发现,(2) 定义他们怎样在internet上互相作用,并在一个全球的注册体系架构中共享信息。UDDI是这样一种基础的系统构筑模块,他使商业实体能够快速,方便地使用他们自身的企业应用软件来发现合适的商业对等实体,并与其实施电子化的商业贸易。
UDDI同时也是Web服务集成的一个体系框架。它包含了服务描述与发现的标准规范。UDDI规范利用了W3C和Internet工程任务组织(IETF)的很多标准作为其实现基础,比如扩展标注语言(XML),HTTP和域名服务(DNS)这些协议。另外,在跨平台的设计特性中,UDDI主要采用了已经被提议给W3C的SOAP(Simple Object Access Protocol,简单对象访问协议)规范的早期版本。
 
WSDL(Web Service Description Language)Web服务器描述语言是用XML文档来描述Web服务的标准,是Web服务的接口定义语言,由Ariba、Intel、IBM、MS等共同提出,通过WSDL,可描述Web服务的三个基本属性:·1服务做些什么——服务所提供的操作(方法)·2如何访问服务——和服务交互的数据格式以及必要协议3·服务位于何处——协议相关的地址,如URL。WSDL文档以端口集合的形式来描述Web服务,WSDL 服务描述包含对一组操作和消息的一个抽象定义,绑定到这些操作和消息的一个具体协议,和这个绑定的一个网络端点规范。WSDL 文档被分为两种类型:服务接口(service interface )和服务实现(service implementations)   服务接口文档中的主要元素作用分别为:types:定义了Web服务使用的所有数据类型集合,可被元素的各消息部件所引用。它使用某种类型系统(一般地使用XML Schema中的类型系统)。 message:通信消息数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。operation:对服务中所支持操作的抽象描述。一般单个operation描述了一个访问入口的请求/响应消息对。 portType:对于某个访问入口点类型所支持操作的抽象集合。这些操作可以由一个或多个服务访问点来支持。 binding:包含了如何将抽象接口的元素(portType)转变为具体表示的细节,具体表示也就是指特定的数据格式和协议的结合;特定端口类型的具体协议和数据格式规范的绑定。 port:定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。 service:这是一个粗糙命名的元素,代表端口的集合;相关服务访问点的集合。 可见,portType(与message和type元素的细节相结合)描述了Web服务是什么,binding元素描述了如何使用Web服务,port及service元素描述了Web服务的位置.。
 
 

什么是SOAP,有哪些应用。

simple object access protocal,简单对象接受协议.以xml为基本编码结构,建立在已有通信协议上(如http,不过据说ms在搞最底层的架构在tcp/ip上的soap)的一种规范
是微软大力推广的Web Service使用的协议..
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息
 

.net中的垃圾回收机制

如果发现内存不够,则垃圾回收器,将全部对象作为无效对象(被回收对象),然后先将全局变量,static,处于活动中的局部变量,以及当前CG指针指向的对象放入一个表中.然后
会搜索新列表中的对象所引用的对象.加入列表中,其他没有被加入列表的对象都会被回收.
 

常用的调用webservice方法有哪些?

可以从浏览器、ASP页或其他WEB服务调用可以使用HTTP-GET   HTTP-POST访问WEB服务也可以从ASP页或其他WEB服务向其他WEB服务发出SOAP请求HTTP-GET   HTTP-POST  SOAP  使用WEB服务代理
答案(2)1.使用WSDL.exe命令行工具。
2.使用VS.NET中的Add Web Reference菜单选项
 

ADO.NET相对于ADO等主要有什么改进?

新增dataset等,不需要随时保持连接,性能提高
数据的内存中表示形式
在 ADO 中,数据的内存中表示形式为记录集。在 ADO.NET 中,它为数据集。它们之间有重要的差异。
表的个数
记录集看起来像单个表。如果记录集将包含来自多个数据库表的数据,则它必须使用 JOIN 查询,将来自各个数据库表的数据组合到单个结果表中。
相反,数据集是一个或多个表的集合。数据集内的表称为数据表;明确地说,它们是 DataTable 对象。如果数据集包含来自多个数据库表的数据,它通常将包含多个 DataTable 对象。即,每个 DataTable 对象通常对应于单个数据库表或视图。这样,数据集可以模仿基础数据库的结构。
数据集通常还包含关系。数据集内的关系类似于数据库中的外键关系,即它使多个表中的行彼此关联。例如,如果数据集包含一个有关投资者的表和另一个有关每个投资者的股票购买情况的表,则数据集可能还包含一个关系来连接投资者表的各个行和购买表的对应行。
由于数据集可以保存多个独立的表并维护有关表之间关系的信息,因此它可以保存比记录集丰富得多的数据结构,包括自关联的表和具有多对多关系的表。
数据导航和游标
在 ADO 中,您使用 ADO MoveNext 方法顺序扫描记录集的行。在 ADO.NET 中,行表示为集合,因此您可以像依次通过任何集合那样依次通过表,或通过序号索引或主键索引访问特定行。DataRelation 对象维护有关主记录和详细资料记录的信息,并提供方法使您可以获取与正在操作的记录相关的记录。例如,从 Investor 表的“Nate Sun”的行开始,可以定位到 Purchase 表中描述其购买情况的那组行。
将打开连接的时间降至最低
在 ADO.NET 中,打开连接的时间仅足够执行数据库操作,例如“选择”(Select) 或“更新”(Update)。您可以将行读入数据集中,然后在不保持与数据源的连接的情况下使用它们。在 ADO 中,记录集可以提供不连接的访问,但 ADO 主要是为连接的访问设计的。
ADO 和 ADO.NET 中的不连接处理之间存在一个显著差异。在 ADO 中,通过调用 OLE DB 提供程序来与数据库通信。ADO.NET 中通过 TableAdapter 或数据适配器(如 SqlDataAdapter)与数据库通信,这会调用 OLE DB 提供程序或基础数据源提供的 API。ADO 和 ADO.NET 之间的主要区别在于:在 ADO.NET 中,适配器允许您控制将对数据集所做的更改传输到数据库的方式,方法是实现性能优化、执行数据验证检查或添加其他任何额外处理。
在应用程序间共享数据
在应用程序间传输 ADO.NET 数据集比传输 ADO 不连接的记录集要容易得多。若要将 ADO 不连接的记录集从一个组件传输到另一个组件,请使用 COM 封送。若要在 ADO.NET 中传输数据,请使用数据集,它可以传输 XML 流。
相对于 COM 封送,XML 文件的传输提供以下便利之处:
更丰富的数据类型
COM 封送处理提供一组有限的数据类型(由 COM 标准定义的那些类型)。由于 ADO.NET 中的数据集传输基于 XML 格式,所以对数据类型没有限制。因此,共享数据集的组件可以使用这些组件一般会使用的任何丰富的数据类型集。
性能
传输大型 ADO 记录集或大型 ADO.NET 数据集会使用网络资源;随着数据量的增长,施加于网络的压力也在增加。ADO 和 ADO.NET 都使您可以最大限度地降低所传输的数据。但 ADO.NET 还提供另一个性能优势:ADO.NET 不需要数据类型转换。而需要 COM 封送来在组件间传输记录集的 ADO,则需要将 ADO 数据类型转换为 COM 数据类型。
穿透防火墙
防火墙可以影响试图传输不连接的 ADO 记录集的两个组件。请记住,防火墙通常配置为允许 HTML 文本通过,但防止系统级请求(如 COM 封送)通过。
因为组件使用 XML 交换 ADO.NET 数据库,所以防火墙可以允许数据集通过

ASP.NET与ASP相比,主要有哪些进步?

asp解释型,aspx编译型,性能提高,有利于保护源码
 

C#中的委托是什么?事件是不是一种委托?

委托是一种安全的函数指针,事件是一种消息机制
   委托是对函数的封装,可以当作给方法的特征制定一个名称。事件是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程[C#高级编程]
    委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。        委托对象用delegate来声明。事件是说在发生其他类或对象关注的事情时,类或对象可通过事件通知他们
 

你对XMLHTTP、WEBSERVICE 了解吗?简单描述其特点、作用

XMLHTTP是一组API函数集,可被JavaScript、JScript、VBScript以及其它web浏览器内嵌的脚本语言调用,通过HTTP在浏览器和web服务器之间收发XML或其它数据。XMLHTTP最大的好处在于可以动态地更新网页,它无需重新从服务器读取整个网页,也不需要安装额外的插件。该技术被许多网站使用,以实现快速响应的动态网页应用。例如:Google的Gmail服务、Google Suggest动态查找界面以及Google Map地理信息服务。
XMLHTTP是AJAX网页开发技术的重要组成部分。
除XML之外,XMLHTTP还能用于获取其它格式的数据,如JSON或者甚至纯文本。
WebService是由W3C组织定义的“一个软件系统被设计为支持跨网络实现机器到机器共同操作”。WebService经常使用诸如Web APIs来跨网络访问并执行远端系统上的服务。
 

事务是什么?

具有原子性特点
 

游标的作用?如何知道游标已经到了最后?

指示当前记录的位置,检查NULL
 

触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。

一个是操作前,一个是操作后
请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
session(viewstate) 简单,但易丢失
application 全局
cookie 简单,但可能不支持,可能被伪造
input type="hidden" 简单,可能被伪造
url参数 简单,显示于地址栏,长度有限
数据库 稳定,安全,但性能相对弱
 

请指出GAC的含义

全局程序集缓存
 

如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?

input type=""
url
数据库
 

用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?

三层,表现,逻辑,数据, 安全性,维护性
 

通过超链接怎样传递中文参数?

URLEncode URLDecode
 

需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.

string inputStr=" xx xx ";
inputStr=Regex.Replace(inputStr.Trim()," *"," ");
 

在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?

using 指令 和语句 new 创建实例 new 隐藏基类中方法
using 引入名称空间或者使用非托管资源
new 新建实例或者隐藏父类方法
 

什么是Application Pool?

Web应用,类似Thread Pool,提高并发性能
 

链表和数组的区别,各有什么优缺点.

一个可以动态增长,一个固定(VB中可以Redim),性能数组教好
 

什么是虚函数?

可以被重写

什么是抽象函数?

必须被重写
 

什么是内存泄漏,怎样最简单的方法判断被存泄漏 ?

C++,C中忘了释放内存,内存不会再次分配

1SQL Server的两种索引是何形式?索引的作用?索引的优缺点?

cluster和非cluster,加速查找,占用额外控件,维护索引耗费时间
 

简述 private、 protected、 public、 internal 修饰符的访问权限。

private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。
 

进程和线程的区别

进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。
 

成员变量和成员函数前加static的作用

它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。
 

malloc和new的区别

new是C++的关键字。malloc在分配内存时必须按给出的字节分配,new可以按照对象的大小自动分配,并且能调用构造函数。可以说new是对象的对象,而malloc不是。本质上new分配内存时,还会在实际内存块的前后加上附加信息,所以new所使用的内存大小比malloc多。
 

堆和栈的区别

栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。
栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。
 

重载与覆盖的区别

1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。
 

简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。

WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。
 

new有几种用法

第一种:new Class();
第二种:覆盖方法
public new XXXX(){}
第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。
 

如何把一个array复制到arrayList里

foreach( object o in array )arrayList.Add(o);
 

datagrid.datasouse可以连接什么数据源

dataset,datatable,dataview , IList
 

概述反射和序列化

反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
 

概述o/r mapping 的原理>

利用反射,配置 将类于数据库表映射
 

用sealed修饰的类有什么特点

sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
 

1. 填空: 

(1)面向对象的语言具有___

继承性、封装性、多态性。

(2)能用foreach遍历访问的对象

需要实现 IEnumerable接口或声明GetEnumerator 方法的类型

(3)列举ADO.net中的五个主要对象

Command、Connection、DataSet、DataAdapter、DataReader。

2. 不定项选择:

(1) 以下叙述正确的是: 
      A. 接口中可以有虚方法。     B. 一个类可以实现多个接口。 
      C. 接口不能被实例化。       D. 接口中可以包含已实现的方法。 
 (2) 从数据库读取记录,你可能用到的方法有:
      A. ExecuteNonQuery            B. ExecuteScalar
      C. Fill                        D. ExecuteReader

3. 简述 private、 protected、 public、 internal 修饰符的访问权限。

4. 写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键,  注意:ID
可能不是连续的。) 

5 .列举ASP.NET 页面之间传递值的几种方式。 

三种比较常见的方式,一种是可以通过用QueryString来传送相应的值,再一种是通过session变量来传送相应的值,还有就是通过Server.Transfer方法来实现
(1)queryString   
  (2)session   
  (3)cookie   
  (4)server.transfer   
  (5)hidden   control/view   state   
  (6)static   member.   
  (7)cache   
  (8)application   
  (9)DataBase   
  (10)xml   or   other   Files   
  (11)XMLHTTP   or   Hidden   iFrame/frame   
  (12)Context.user.identity   
    
  我正在做一个通用提示叶面,所有叶面出现问题都要,传递几个变量字符串到同一个叶面 hitMsg.aspx 变量字符串包括提示语言,即将跳转的叶面,跳转时间。在1-11种方案中哪个更好些?   
  (1)queryString的毛病是无法传递很长字符串,比如系统错误信息往往就一整个屏幕。   
  (2)session的毛病是不能过多使用,依赖Cookie,容易丢失。   
  (3)cookie的毛病是依赖客户端设置,不可靠。   
  (4)server.transfer的毛病是接收叶面要为发送叶面准备好,只能定制专门一个叶面接受定制好的叶面。   
  不能是一个叶面接受任何叶面。   
  (5)hidden   control/view   state只能传递本页。除非特殊制作。   
  (6)static   member.无法保证线程安全,可能会此处栽瓜他处得豆。   
  (7)cache不适合使用一次就扔的变量。   
  (8)application全局的,开销大。   
  (9)DataBase全局固化的,开销更大,除非做日志跟踪。   
  (10)xml   or   other   Files全局固化的,开销大,除非做日志跟踪。   
  (11)XMLHTTP   or   Hidden   iFrame/frame,做这个过于烦琐。   
  (12)Context这个占用了用户id,不适合做这个。  

9. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 
 求第30位数是多少, 用递归算法实现。(C#语言)

-------------------------------------------
a0   =   0,a1   =   1,An   =   An-1   +   An-2(n>=2)   
  int[]   iArray   =   new   int[31];   
  iArray[0]   =   0;   
  iArray[1]   =   1;   
    
  for   (int   i   =   2;   i   <=   30;   i++)   
  {   
        iArray[i]   =   iArray[i   -   1]   +   iArray[i   -   2];   
  }   
   ---------------参考答案二---------------------------------
  int   i=0,ii=1,s=1,num=0;   
  while(num<=30)   
  {   
  s=i+ii;   
  Response.Write(i+"+"+ii+"="+s+"<br>");   
  if(s==1)   
  {   
  i=1;   
  }   
  else   
  {   
  i=s-i;   
  }   
  ii=s;   
  num++;   
  }
========================

10.  程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言) 
要求:  1.要有联动性,老鼠和主人的行为是被动的。
2.考虑可扩展性,猫的叫声可能引起其他联动效应。 

三个类,猫,老鼠和主人
public sealed class Cat
{
   // 猫叫时引发的事件
   public event EventHandler Calling;
   public void Call()
   {
       Console.WrietLine("猫叫了...");
       if(Calling != null) // 检查是否有事件注册
           Calling(this, EventArgs.Empty); // 调用事件注册的方法。
   }
}
// 老鼠,提供一个方法表示逃跑
public sealed calss Mouse
{
    public void Escape(object sender, EventArgs e)
    {
         Console.WriteLine("老鼠逃跑了...");
    }
}
// 主人,发生猫叫的时候惊醒
public sealed class Master
{
    public void Wakened(object sender, EventArgs e)
    {
        Console.WriteLine("主人惊醒了...);
    }
}
// 用于测试的执行方法
// 程序入口点
public static Program
{
    public static int Main(string[] args)
    {
        // 建立猫
        Cat cat = new Cat();
        // 建立老鼠
        Mouse mouse = new Mouse();
        // 建立主人
        Master master = new Master();
     
        // 注册事件
        cat.Calling += new EventHandler(mouse.Escape);
        cat.Calling += new EventHandler(master.Wakened);
        // 猫开始叫
        cat.Call();
    }
}
要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象 
评分标准: <1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分) 
                 <2>从Mouse和Master中提取抽象(5分) 
                 <3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分)
 
    public interface Observer 
    { 
        void Response();    //观察者的响应,如是老鼠见到猫的反映 
    } 
    public interface Subject 
    { 
        void AimAt(Observer obs);  //针对哪些观察者,这里指猫的要扑捉的对象---老鼠 
    } 
    public class Mouse : Observer 
    { 
        private string name; 
        public Mouse(string name, Subject subj) 
        {           
            this.name = name; 
            subj.AimAt(this); 
        } 
        
        public void Response() 
        { 
            Console.WriteLine(name + " attempt to escape!"); 
        } 
    } 
    public class Master : Observer 
    {   
        public Master(Subject subj) 
        {           
            subj.AimAt(this); 
        } 
        
        public void Response() 
        { 
            Console.WriteLine("Host waken!"); 
        }  
    } 
  
    public class Cat : Subject 
    { 
        private ArrayList observers; 
        public Cat() 
        {   
            this.observers = new ArrayList(); 
        } 
        public void AimAt(Observer obs) 
        { 
            this.observers.Add(obs); 
        } 
        public void Cry() 
        { 
            Console.WriteLine("Cat cryed!"); 
            foreach (Observer obs in this.observers) 
            { 
                obs.Response(); 
            } 
        } 
    } 
    class MainClass 
    {       
        static void Main(string[] args) 
        { 
            Cat cat = new Cat(); 
            Mouse mouse1 = new Mouse("mouse1", cat); 
            Mouse mouse2 = new Mouse("mouse2", cat); 
            Master master = new Master(cat); 
            cat.Cry(); 
        } 
    }
-----------------------------
问题: 

ASP.NET中共有几种类型的控件?各有什么区别?  

ASP.NET的控件包括WEB服务器控件、WEB用户控件、WEB自定义控件、HTML服务器控件和HTML控件。HTML控件、HTML服务器控件和WEB服务器控件之间的区别如下所示。
      HTML控件:这完全是浏览器端的HTML标签控件,例如HTML中常见的单选框表单控件,其HTML代码如以下代码所示。
<input type="radio" id="Radio1" value="select1" checked="checked" />
这类控件在服务器端被视为字符串直接发送到浏览器端,由浏览器进行解析。
      HTML服务器控件:即在HTML控件的基础上加上“runat”属性,并将其值设置为“server”。
  WEB服务器控件:也被称为asp.net服务器控件,是ASP.NET特有的WEB编程元素。该控件运行于服务器端,根据代码的执行结果生成一个或者多个HTML控件,而不是直接描述HTML控件。WEB服务器控件以“asp:”开头,后面是控件类型名称,如以下代码所示。
<asp:TextBox runat="server" ID="MyTextBox" Text="初始文本" TextMode="MultiLine"></asp:TextBox>
 

6.WEB控件可以激法服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回。 

 
下面来简单看一下页面PostBack的原理,和Button,ImageButton PostBack的特殊性。
__doPostBack是一个纯粹并且是非常简单的javascript函数,大部分的页面PostBack都是由它触发的。注意,这里是“大部分”,因为只有两个Web Server Control 会自己触发页面的PostBack,其它的所以控件都是通过__doPostBack函数触发页面的PostBack,那先来看一下这个函数的定义吧:
[复制此代码]CODE:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
通过上面的代码可以看到,__doPostBack带有两个参数,eventTarget是标识将要引发页面PostBack的控件ID,eventArgument参数提供了在引发页面PostBack事件时所带的额外参数。当然这个函数被函数时,这两个参数的值将赋值给页面的两个隐含变量__EVENTTARGET和__EVENTARGUMENT,然后调用页面的submit方法提交页面表单。这就是为什么我们可以通过Request.Form[“__EVENTTARGET”]获取得到引发页面PostBack的控件ID的原因。
了解了__doPostBack函数后,我们可以很容易的利用它非常方便地自己触发自定义的PostBack事件。那上面也说了,大部分的控件都是调用这个方法来引了页面的PostBack,只有两个控件是例外,Button 和 ImageButton,正是因为它们不是通过调用__doPostBack来回发事件,所以通过表单隐含变量__EVENTTARGET和__EVENTARGUMENT是无法获取得到引发PostBack的Button或ImageButton的ID和参数值的,只有通过下面的方式才能得它们的实例,进而判断是哪个控件引发的PostBack的: C#
[复制此代码]CODE:
foreach (string str in Request.Form)
{
Control c = Page.FindControl(str);
if (c is Button)
{
control = c;
break;
}

}

为什么能通过枚举Request.Form集合的Key值,查找到的回发事件源呢?在这里Button和ImageButton又有一些不同。Button控件引发的PostBack,会将Button本身的ID作为Request.Form的一个Key,它的Value是Button的Text属性值,回传给服务器,这样服务器就可以通过枚举Request.Form的Key值,去查找出控件实例,判断是否为Button控件,进而得到是哪个控件引发的PostBack事件。而ImageButton的不同就在于,它不仅仅是用ImageButton的ID作为Request.Form的Key,它是用ImageButton的ID加上.x和.y,作为Key,在Request.Form添加两上键值对,这两个键值对的值应该是标识ImageButton的图片大小。同样的,了解了这个规律后,我们仍然可以通过一定的方式得到是否是由ImageButton引发的PostBack。

总结:理解并掌握__doPostBack原理对我们更加了解Page的事件模型有非常大的帮助,并且也是我们进一步利用好页面的PostBack事件的一个重要基础。在整个asp.net页面PostBack模型中,只有Button和ImageButton是个例外,其它的控件都是一样的,也就是使用__doPostBack函数。在当我们需要通过__EVENTTARGET取得到事件源控件的话,这点是特别要注意的。
 
 

WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用? 

可以调用
例如:<asp:TextBox id="TextBox1" οnclick="clientfunction();" runat="server">
</asp:TextBox>
<INPUT id="Button2" value="Button" name="Button2"
runat="server" οnclick="clientfunction();">
 
当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决 
很有可能是在Page_Load中数据处理时没有进行Page的IsPostBack属性判断
 

请解释一个WEB页面中代码执行次序 

页请求

页请求发生在页生命周期开始之前。用户请求页时,ASP.NET 将确定是否需要分析和编译页(从而开始页的生命周期),或者是否可以在不运行页的情况下发送页的缓存版本以进行响应。

开始

在开始阶段,将设置页属性,如 Request 和 Response。在此阶段,页还将确定请求是回发请求还是新请求,并设置 IsPostBack 属性。此外,在开始阶段期间,还将设置页的 UICulture 属性。
页初始化
页初始化期间,可以使用页中的控件,并将设置每个控件的 UniqueID 属性。此外,任何主题都将应用于页。如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。

加载

加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。

验证

在验证期间,将调用所有验证程序控件的 Validate 方法,此方法将设置各个验证程序控件和页的 IsValid 属性。

回发事件处理

如果请求是回发请求,则将调用所有事件处理程序。

呈现

在呈现之前,会针对该页和所有控件保存视图状态。在呈现阶段中,页会针对每个控件调用 Render 方法,它会提供一个文本编写器,用于将控件的输出写入页的 Response 属性的 OutputStream 中。

卸载

完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。此时,将卸载页属性(如 Response 和 Request)并执行清理。
 
页事件
典型使用
PreInit
使用该事件来执行下列操作:
检查 IsPostBack 属性来确定是不是第一次处理该页。
创建或重新创建动态控件。
动态设置主控页。
动态设置 Theme 属性。
读取或设置配置文件属性值。
注意
如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被重写。
Init
在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。
InitComplete
由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。
PreLoad
如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。
在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。
Load
Page 在 Page 上调用 OnLoad 事件方法,然后以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。
使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。
控件事件
使用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
注意
在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。
LoadComplete
对需要加载页上的所有其他控件的任务使用该事件。
PreRender
在该事件发生前:
Page 对象会针对每个控件和页调用 EnsureChildControls。
设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息,请参见下面的数据绑定控件的数据绑定事件。
页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。
SaveStateComplete
在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。
使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。
Render
这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。
如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件。
用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。
Unload
该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。
对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。
注意
在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。
其他的页生命周期注意事项
各个 ASP.NET 服务器控件都有自己的生命周期,该生命周期与页生命周期类似。例如,控件的 Init 和 Load 事件在相应的页事件期间发生。
虽然 Init 和 Load 都在每个控件上以递归方式发生,但它们的发生顺序相反。每个子控件的 Init 事件(还有 Unload 事件)在为其容器引发相应的事件之前发生(由下到上)。但是,容器的 Load 事件是在其子控件的 Load 事件之前发生(由上到下)。
可以通过处理控件的事件(如 Button 控件的 Click 事件和 ListBox 控件的 SelectedIndexChanged 事件)来自定义控件的外观或内容。在某些情况下,可能也需处理控件的 DataBinding 或 DataBound 事件。有关更多信息,请参见各个控件的类参考主题以及开发自定义 ASP.NET 服务器控件。
当从 Page 类继承类时,除了可以处理由页引发的事件以外,还可以重写页的基类中的方法。例如,可以重写页的 InitializeCulture 方法,以便动态设置区域性信息。注意,在使用 Page_事件语法创建事件处理程序时,将隐式调用基实现,因此无需在方法中调用它。例如,无论是否创建 Page_Load 方法,始终都会调用页基类的 OnLoad 方法。但是,如果使用 override 关键字(在 Visual Basic 中为 Overrides)重写页的 OnLoad 方法,则必须显式调用基方法。例如,如果在页中重写 OnLoad 方法,则必须调用 base.Load(在 Visual Basic 中为 MyBase.Load)以运行基实现。
添加的控件的追赶事件
如果控件是在运行时动态创建的,或者是以声明方式在数据绑定控件的模板中创建的,它们的事件最初与页上的其他控件的事件并不同步。例如,对于运行时添加的控件,Init 和 Load 事件在页生命周期中的发生时间可能要比以声明方式创建的控件的相同事件晚得多。因此,从实例化那一刻起,动态添加的控件的事件就一直是在模板中的控件的事件之后发生,直到赶上该控件加入 Controls 集合时所对应事件为止。
一般来说,除非存在嵌套数据绑定控件,否则,您不必担心这种情况。如果子控件已执行数据绑定,但其容器控件尚未执行数据绑定,则子控件中的数据与其容器控件中的数据可能不同步。如果子控件中的数据根据容器控件中的数据绑定值执行了处理,这种情况则尤其显著。
例如,假定有一个 GridView,它的每一行显示一条公司记录,此外,有一个 ListBox 控件包含公司管理者列表。若要填充管理者列表,则需要将 ListBox 控件绑定到一个数据源控件(如 SqlDataSource),后者在查询中使用 CompanyID 来检索公司管理者数据。
如果以声明方式设置了 ListBox 控件的数据绑定属性(如 DataSourceID 和 DataMember),ListBox 控件将尝试在包含行的 DataBinding 事件期间绑定到其数据源。不过,行的 CompanyID 字段直到 GridView 控件的 RowDataBound 事件发生后才包含值。这种情况下,先绑定子控件(ListBox 控件),后绑定包含控件(GridView 控件),因此它们的数据绑定阶段并不同步。
若要避免此种情况,需要将 ListBox 控件的数据源控件与 ListBox 控件自身放在同一模板项中,并且不要以声明方式设置 ListBox 的数据绑定属性。而应在 RowDataBound 事件期间在运行时以编程方式设置它们,这样,到 CompanyID 信息可用时 ListBox 控件才会绑定到其数据。
有关更多信息,请参见使用数据源控件绑定到数据。
数据绑定控件的数据绑定事件
为了帮助您理解页生命周期与数据绑定事件之间的关系,下表列出了数据绑定控件(如 GridView、DetailsView 和 FormView 控件)中与数据相关的事件。
控件事件
典型使用
DataBinding
该事件在包含控件(或 Page 对象)的 PreRender 事件之前由数据绑定控件引发,会标记控件到数据的绑定过程的起点。
如果需要,使用该事件以手动方式打开数据库连接。(数据源控件通常不需要如此操作。)
RowCreated(仅限 GridView)或 ItemCreated(DataList、DetailsView、SiteMapPath、DataGrid、FormView 和 Repeater 控件)
使用该事件来操作不依赖于数据绑定的内容。例如,在运行时,可以以编程方式向 GridView 控件中的页眉或页脚行添加格式。
RowDataBound(仅限 GridView)或 ItemDataBound(DataList、SiteMapPath、DataGrid 和 Repeater 控件)
当该事件发生时,行或项中的数据可用,因此,可以在子数据源控件上格式化数据或设置 FilterExpression 属性,以便显示行或项中的相关数据。
DataBound
该事件在数据绑定控件中标记数据绑定操作的结尾。在 GridView 控件中,会针对所有行和任何子控件完成数据绑定。
使用该事件格式化数据绑定内容,或在依赖来自当前控件的内容的值的其他控件中启动数据绑定。(有关详细信息,请参见本主题中前面的“添加的控件的追赶事件”。)
登录控件事件
Login 控件可以使用 Web.config 文件中的设置来自动管理成员资格验证。不过,如果应用程序要求您自定义控件的工作方式,或者您要了解 Login 控件事件与页生命周期的关联方式,可以使用下表中列出的事件。
控件事件
典型使用
LoggingIn
在回发期间,当页的 LoadComplete 事件发生后就会引发该事件。它标记登录过程的起点。
对必须在验证过程开始前发生的任务使用该事件。
Authenticate
该事件在 LoggingIn 事件之后引发。
使用该事件来重写或增强 Login 控件的默认验证行为。
LoggedIn
该事件在验证用户名和密码后引发。
使用该事件来重定向到另一个页或动态设置控件中的文本。如果出现错误或验证失败,就不会发生该事件。
LoginError
如果验证失败,将引发该事件。
使用该事件来设置控件中的问题解释文本或将用户定向到不同的页。
 
源文档 <http://msdn.microsoft.com/zh-cn/library/ms178472(VS.80).aspx>
 

请解释转发与跳转的区别? 

服务器端 客户端
  

请解释一下。NET多层应用程序中层与层之间以那几种方式进行数据传递。并解释你自己的项目中采用那种方式进行。 

三层架构一般指的是界面层,业务层,数据层。
 
界面层就是系统的操作界面,和用户直接交互的地方。
 
业务层又称为逻辑层,英文名称是Business Logic Layer,简称BLL,是执行业务逻辑的地方,也就是业务规则都在这一层体现。
 
数据层也称为数据访问层,英文名称是Database Access Layer,简称DAL,这里是直接和数据库进行交互的地方,也是整个系统里唯一允许访问数据库的地方。
 
除此之外,还有一个业务实体层,这个层比较特殊,就是定义实体类的地方,有些人把这个层归属业务层,有些人把这个独立出来,变成一个公共层。
 
各个层次之间的访问关系:
 
界面层只能单向访问业务逻辑层,业务逻辑层只能单向访问数据层,这三层都可以访问公共模块(公共层)。这样做有很多好处,比如界面层就不知道数据层的存在,我们在界面层或者数据层做的更改都不会对双方造成大的影响。这一点很重要,因为这样我们开发的数据层就可以同时被多个系统使用,比如同时被BS和CS的系统使用;另外,我们也可以同时支持多个数据库,比如我们可以让系统同时支持oracle,access,sql server,而界面层不用更改。
 
当然,这种单向调用就牵涉到我们上面所说的业务实体层的归属问题,如果我们把它放到业务罗基层,就会破坏这种关系,所以最好把它独立出去,做成公共层。
 
优点和缺点:
 
三层架构的优点上面说了很多,出了那些以外还有易扩展,层次清晰等特点,但缺点也很明显,就是如果一个系统非常简单,那么就不适合使用三层架构,这样会把简单的事情搞复杂。
 

asp.net中的数据绑定与传统数据绑定有什么区别? 

传统的应用程序需要编写代码来绑定数据。
 
1.开发方面:   Asp页面代码和程式代码混在一块,开发杂乱,并且很难维护  
                          Asp.Net将它们分成两个页面(页面文件和程式文件),互不影响  
  2.Asp.Net采用三层架构,如果功能改变只修改商业逻辑即可  
      Asp还要大修改  
   
  3.Asp.Net是基于Ado.Net     Asp是基于Ado,   Ado是面向记录的,Ado.Net是面向数据集的  
      在性能方面要好的多  
   
  4.Asp.Net可以说不是Asp的升级,内部实现方式很大不同  
  5.Asp保持持续连接,而Asp.Net间断性连接,在需要时打开连接,不用时关闭连接,及时释放  
      资源
 
ASP.NET 1.x 和 ASP.NET 2.0 中数据绑定的主要区别在于提供程序模型是否自动同步发生了更改的数据。换句话说,由于在数据源中置入了一个事件模型,如果修改支持数据源的数据,则自动更新绑定控件。

.net采用委托实现的事件模型与JAVA中采用接口实现的事件模型有什么区别,以图示方式解释。 

Swing 事件模型,有些类似于本节中介绍的接口机制。它使用的接口,诸如 ActionListener、KeyListener、MouseListener(注意:按照 Java 的命名习惯,接口命名不用前缀 I)等;它同时也提供一些接口的默认实现,如 KeyAdapter,MouseAdapter 等,使用方法大概和本节介绍的类似,它使用的是 addActionListener/removeActionListener,addKeyListener/removeKeyListener,addMouseListener/removeMouseListener 等方法,来增减这些接口的。
 
我们看到 Swing 的命名方式,将这些接口都命名为 Listener,监听器;而相比之下,.NET 事件模型中,对事件的处理被称为 handler,事件处理程序。一个采用“监听”,一个是“处理”,我认为这体现了一种思维上的差异。
 

接口的显式实现有什么意义?

显式实现接口成员
接口是支持一些功能的协定。实现接口的类必须为接口中指定的成员提供实现细节。例如,IEnumerator 接口定义成员签名,必须实现成员签名才能支持对一组对象(如集合)进行枚举。若要实现 IEnumerator,类必须实现 Current、MoveNext 和 Reset 成员。
当接口成员由类显式实现时,只能通过使用对接口的引用来访问该成员。这将导致隐藏接口成员。显式实现接口成员的常见原因不仅是为了符合接口的协定,而且也是为了以某种方式改进它(例如,提供应用来代替接口的弱类型方法的强类型方法)。显式实现接口成员的另一个常见原因是存在不应由开发人员调用显式接口成员的时候。例如,GetObjectData 成员是最常显式实现的,因为它由序列化基础结构调用而不用于从代码调用。
下列设计准则有助于确保您的库设计仅在需要时使用显式接口实现。
如果没有充分理由,应避免显式实现接口成员。
要理解显式实现需要具备很高深的专业知识。例如,很多开发人员不知道显式实现的成员是可以公共调用的,即使其签名是私有的也一样。由于这个原因,显式实现的成员不显示在公共可见的成员列表中。显式实现成员还会导致对值类型的不必要装箱。
如果成员只应通过接口调用,则考虑显式实现接口成员。
这主要包括支持 .NET Framework 基础结构(如数据绑定或序列化)的成员。例如,IsReadOnly 属性只应由数据绑定基础结构通过使用对 ICollection 接口的引用来访问。由于满足此准则,List 类显式实现该属性。
考虑显式实现接口成员以模拟变体(即,更改重写成员中的参数或返回类型)。
为了提供接口成员的强类型版本,通常会这么做。
考虑显式实现接口成员以隐藏一个成员并添加一个具有更好名称的等效成员。
这样可以有效地重命名成员。例如,Stream 显式实现 Dispose 并在相应的位置提供 Close 方法。
不要将显式成员用作安全边界。
显式实现成员不提供任何安全性。通过使用对接口的引用,这些成员都是可以公共调用的。
如果显式实现的成员的功能意在由派生类特殊化,则一定要提供具有相同功能的受保护虚拟成员。
不能重写显式实现的成员。如果在派生类中重新定义成员,则派生类不能调用基类实现。应通过使用与显式接口成员相同的名称或将 Core 附加到接口成员名称来命名受保护成员。 

请叙述类与结构的区别。

1)、结构是值类型;
2)、结构不支持继承;
3)、结构不能定义默认的构造函数;
4)、结构不能定义析构函数;
5)、结构不能使用初始值设置域值。

Q:软件开发过程一般有几个阶段?每个阶段的作用?

需求分析,概要设计,详细设计,软件编码,软件测试
一,可行性分析   
  二,需求分析   
  三,实施和编码   
  四,测试   
  五,维护  

Q:微软推出了一系列的Application Block,请举出您所知道的Application Block并说明其作用?

Q:请列举一些您用到过的设计模式以及在什么情况下使用该模式?

Q:您对WebService的体会?

以下几道题目如果您不会,请较为详细的描述您的解决思路和方法

Q:通过超链接怎样传递中文参数?

Q:请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?

For(i=0;i<this.control.count;i++)
If(control is TextBox)
{
         (control   as   TextBox).Text   =   string.Empty;  
}

Q:请编程实现一个冒泡排序算法?

using System;
namespace BubbleSorter
{
 public class BubbleSorter
 {
  public void Sort(int [] list)
  {
   int i,j,temp;
   bool done=false;
   j=1;
   while((j<list.Length)&&(!done))
   {
    done=true;
    for(i=0;i<list.Length-j;i++)
    {
     if(list[i]>list[i+1])
     {
      done=false;
      temp=list[i];
      list[i]=list[i+1];
      list[i+1]=temp;
     }
    }
    j++;
   }
  }
 }
 public class MainClass
 {
  public static void Main()
  {
   int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
   BubbleSorter sh=new BubbleSorter();
   sh.Sort(iArrary);
   for(int m=0;m<iArrary.Length;m++)
    Console.Write("{0} ",iArrary[m]);
   Console.WriteLine();
  }
 }
}
 

1.维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么?

答:尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策。

2.什么是事务?什么是锁?

答:事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么都执行,要么都不执行。
锁是在多用户环境中对数据的访问的限制。SqlServer自动锁定特定记录、字段或文件,防止用户访问,以维护数据安全或防止并发数据操作问题,锁可以保证事务的完整性和并发性。

3.什么是索引,有什么优点?

答:索引象书的目录类似,索引使数据库程序无需扫描整个表,就可以在其中找到所需要的数据,索引包含了一个表中包含值的列表,其中包含了各个值的行所存储的位置,索引可以是单个或一组列,索引提供的表中数据的逻辑位置,合理划分索引能够大大提高数据库性能。

4.视图是什么?游标是什么?

答:视图是一种虚拟表,虚拟表具有和物理表相同的功能,可以对虚拟表进行增该查操作,视图通常是一个或多个表的行或列的子集,视图的结果更容易理解(修改视图对基表不影响),获取数据更容易(相比多表查询更方便),限制数据检索(比如需要隐藏某些行或列),维护更方便。
游标对查询出来的结果集作为一个单元来有效的处理,游标可以定位在结果集的特定行、从结果集的当前位置检索一行或多行、可以对结果集中当前位置进行修改、

5.什么是存储过程?有什么优点?

答:存储过程是一组予编译的SQL语句,它的优点有1.允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。2.允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。3.减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。4.更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。

6.什么是触发器?

答:出发器是一种特殊类型的存储过程,出发器主要通过事件触发而被执行的,触发器的优点:1.强化约束,触发器能够提供比CHECK约束。2.跟踪变化,触发器可以跟踪数据库内的操作,从而不允许未经允许许可的更新和变化。3.联级运算,比如某个表上的触发器中包含对另一个表的数据操作,而该操作又导致该表上的触发器被触发

7.T-SQL中is null和null 的区别?

答:is null 和 null 区别相当于 "是空盒子" 和 "空盒子"的区别

8.什么叫做SQL注入,如何防止?请举例说明。

答:利用sql语言漏洞获得合法身份登陆系统。如身份验证的程序设计成:
SqlCommand com=new SqlCommand("Select * from users where username='"+t_name.text+"' and pwd='"+t_pwd.text+"'");
object obj=com.ExcuteScale();
if(obj!=null)
     {
       //通过验证
     }
这段代码容易被sql注入。如用户在t_name中随便输入,在t_pwd中输入1' and 1='1     就可以进入系统了。
 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

1.C#类和接口的区别

接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!
而类是负责功能的具体实现!
在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
但接口是一个行为的规范,里面的所有东西都是抽象的!
一个类只可以继承一个基类也就是父类,但可以实现多个接口
PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现作为一个接口的使用好处,最直接的就是设计原则中OCP(开放封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使用接口的类)的使用,对与扩展是开放的,我们可以另写一个接口的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个“不能够”是指在规范原则上不应该这么做!  

2.抽象类和接口的区别

答:抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义
抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”
为外部提供调用或功能需要扩充时优先使用接口

3. C#语言中,值类型和引用类型有何不同?

解答
  值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
  值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。

4.结构和类的区别

解答
  1) 结构是一个值类型,保存在栈上,而类是一个引用类型,保存在受管制的堆上。
  2) 对结构中的数据进行操作比对类或对象中的数据进行操作速度要快。
  3) 一般用结构存储多种类型的数据,当创建一个很多类或对象共用的小型对象时,使用结构效率更高。

5.抽象方法和虚方法的区别

抽象方法
使用abstract关键字 public abstract bool Withdraw(…);
抽象方法是必须被派生类覆写的方法。
抽象方法是可以看成是没有实现体的虚方法
如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法
虚方法
使用virtual关键字 public virtual bool Withdraw(…);
调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。
虚方法可以有实现体
---------------------------------------------------------------------------------------------

虚拟方法和抽象方法有什么区别?

抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现
虚拟方法有实现代码
抽象方法则没有,
并且抽象类不能被实例化,只能实例化实现了全部抽象方法的派生类
抽象方法是虚拟方法的一种
抽象方法没有实现,它的存在只是为派生类统一接口;派生类应该实现这个方法
如果编写一个基类,它永远不会被实现,那么就应该将这个类中的一个或多个方法定义为
抽象方法。
抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现
补充一点
只允许在抽象类中使用抽象方法声明
学习
其实大家首先要搞清楚,虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象类中可以包含抽象方法与一般的方法,抽象类不可以new,抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。它们两个相像的一点是都用override重写

转载于:https://my.oschina.net/u/1049299/blog/146098

你可能感兴趣的文章
SharePoint 2013 工作流平台的选项不可用
查看>>
thinkphp 重定向redirect
查看>>
Builder创建者模式
查看>>
安卓应用使用QQ登录的申请流程
查看>>
Android批量图片加载经典系列——采用二级缓存、异步加载网络图片
查看>>
redis 数据类型详解 以及 redis适用场景场合
查看>>
RAC安装重新运行root.sh
查看>>
Mac下面的SecureCRT(附破解方案) 更新到最新的7.3.2(转)
查看>>
H5版俄罗斯方块(5)---需求演进和产品迭代
查看>>
Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景...
查看>>
工作队列(workqueue) create_workqueue/schedule_work/queue_work
查看>>
size_t、ptrdiff_t【转】
查看>>
Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 ...
查看>>
【Linux】查看所使用的Linux系统是32位还是64 位的方法
查看>>
NSJSONSerialization 反序列化失败 NSCocoaErrorDomain Code=3840
查看>>
chrome 谷歌浏览器插件损坏
查看>>
前端知识十分钟预览之学习札记
查看>>
ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件...
查看>>
JavaWeb学习总结(十三)——使用Session防止表单重复提交
查看>>
C# Qrcode生成二维码支持中文,带图片,带文字 2015-01-22 15:11 617人阅读 评论(1...
查看>>