基础知识,面试题,牛人
任何一个使用.NET的人8,
中级.NET开发人员 20,
C# 组件开发人员10,
高级开发人员架构师 25,
ASP.NET(UI)开发人员21,
XML开发人员16
一、任何一个使用.NET的人 8
1.描述线程与进程的区别?
程序与进程概念是不可分的。程序是为了完成某项任务编排的语句序列,它告诉计算机如何执行,因此程序是需要运行的。程序运行过程中需要占有计算机的各种资源才能运行下去。如果任一时刻,系统中只有一道程序,即单道程序系统,程序则在整个运行过程中独占计算机全部资源,整个程序运行的过程就非常简单了,管理起来也非常容易。就象整个一套房子住了一个人,他想看电视就看电视,想去卫生间就去卫生间,没人和他抢占资源。但为了提高资源利用率和系统处理能力,现代计算机系统都是多道程序系统,即多道程序并发执行。程序的并发执行带来了一些新的问题,如资源的共享与竞争,它会改变程序的执行速度。就象多个人同时住一套房子,当你想去卫生间的时候,如果此时卫生间里有人,你就得等待,影响了你的生活节奏。如果程序执行速度不当,就会导致程序的执行结果失去封闭性和可再现性,这是我们不希望看到的。因此应该采取措施来制约、控制各并发程序段的执行速度。由于程序是静态的,我们看到的程序是存储在存储介质上的,它无法反映出程序执行过程中的动态特性,而且程序在执行过程中是不断申请资源,程序作为共享资源的基本单位是不合适的,所以需要引入一个概念,它能描述程序的执行过程而且可以作为共享资源的基本单位,这个概念就是进程。
进程的生命周期
进程和人一样是有生命的,从诞生到死亡要经历若干个阶段。一般说来进程有三种状态:就绪、执行、等待。由多种原因可以导致创建一个进程,例如一个程序从外存调入内存开始执行,操作系统就要为其创建进程,当然还可以有其它原因,如一个应用进程为完成一个特殊的任务,可以自己创建一个子进程。进程被创建后就是在内存中,处于就绪状态,所谓就绪状态就是具备除了CPU之外的所有资源,万事具备,只欠东风,一旦占有了CPU,就变成了执行状态,执行中如果需要等待外围设备输入数据,则进程就沦落为等待状态,操作系统又会从就绪状态队列中调度一个进程占有CPU。等到数据到来后,等待状态的进程又被唤醒成为就绪状态。这些状态的转换是通过进程控制原语实现的。程序的运行是通过进程体现的,操作系统对进程进行管理和控制,那么操作系统怎么了解到进程的状态呢,怎么把资源分配给进程呢,而且进程做状态转换时CPU现场保存在那呢?这要说到PCB(进程控制快)。PCB是进程的唯一标志,在其中记录了进程的全部信息,它是一种记录型的数据结构,相当于进程的档案。操作系统就通过PCB感知进程的存在,通过PCB了解进程和控制进程的运行。PCB也是放在内存中的,如果PCB太大,有些系统把PCB中一些不重要的信息放在外存中。
进程执行速度的制约
并发进程由于共享系统内部资源,因此导致进程执行速度上的制约,这种制约分为:间接制约与直接制约。间接制约引起进程之间的互斥执行,直接制约引起进程间的同步执行。例如一个家里如果只有一个卫生间,卫生间这个公有资源使得每个人只能互斥使用它,这就是间接制约。而直接制约是指并发进程各自执行的结果互为对方的执行条件,例如司机与售票员的关系,当司机到站停车后,售票员才能开门,而只有售票员关门后,司机才能开车,他们之间是同步的。进程的互斥与同步可以很好的通过信号量和PV原语来实现。通过读一些同步与互斥的例子,你会体会到PV原语的精妙,也会感到一种乐趣。并发进程的资源竞争不当还会导致死锁现象。
从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。
理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32多线程上下的功夫。
因此,学习Win32多线程不仅对理解Win32本身有重要意义,而且对学习和领会其它操作系统也有触类旁通的作用。
进程与线程
先阐述一下进程和线程的概念和区别,这是一个许多大学老师也讲不清楚的问题。
进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。
线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。
根据进程与线程的设置,操作系统大致分为如下类型:
(1)单进程、单线程,MS-DOS大致是这种操作系统;
(2)多进程、单线程,多数UNIX(及类UNIX的LINUX)是这种操作系统;
(3)多进程、多线程,Win32(Windows NT/2000/XP等)、Solaris 2.x和OS/2都是这种操作系统;
(4)单进程、多线程,VxWorks是这种操作系统。
在操作系统中引入线程带来的主要好处是:
(1)在进程内创建、终止线程比创建、终止进程要快;
(2)同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。另外,线程的出现还因为以下几个原因:
(1)并发程序的并发执行,在多处理环境下更为有效。一个并发程序可以建立一个进程,而这个并发程序中的若干并发程序段就可以分别建立若干线程,使这些线程在不同的处理机上执行。
(2)每个进程具有独立的地址空间,而该进程内的所有线程共享该地址空间。这样可以解决父子进程模型中,子进程必须复制父进程地址空间的问题。
(3)线程对解决客户/服务器模型非常有效。
2.什么是Windows服务,它的生命周期与标准的EXE程序有什么不同
Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 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用户,这在对系统资源访问的时候特别需要注意。
3.Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么影响?
这个需要针对硬件平台,公式为单个进程能访问的最大内存量=2的处理器位数次方/2,比如通常情况下,32位处理器下,单个进程所能访问的最大内存量为:2的32次方/2 = 2G 。单个进程能访问的最大内存量是最大虚拟内存的1/2,因为要分配给操作系统一半虚拟内存。
32位Windows上单个进程所能访问的最大内存量是
不一定一样,32位的操作系统的进程可访问的最大内存量是4G,这4G包含了虚拟内存,而一个进程可访问的最大内存量也是4G,所以进程内存访问量在物理内存大于等于4G的时候跟虚拟内存无关,而当物理内存小于4G时,进程访问的内存量随着虚拟内存的增加而增加,直到4G。
4.EXE和DLL之间的区别是什么?
EXE是可以单独运行的程序,DLL是不能单独运行,一般是由EXE程序来调用DLL的函数
DLL一般是封装了一些共享的例程和资源,它通常是一个可以被其它应用程序调用的程序模块。一般扩展名为dll。它与EXE有些类似,但动态链接库不能被直接执行,只能被其它EXE或者动态链接库调用。在.NET中,可以通过创建类库的方式创建动态链接库。
EXE File 可执行程序。
一种可在操作系统存储空间中浮动定位的可执行程序。MS-DOS和MS-WINDOWS下,此类文件扩展名为.exe。
WINDOWS操作系统中的二进制可执行文件,可执行文件分两种一种是后辍名为.COM另一种就是.EXE 了。.COM一般用于DOS,在WINDOWS系统中的执行文件一般都是.EXE文件。
EXE是可以单独运行的程序。EXE里含有程序的执行入口,比如说Main()函数。EXE文件可以调用其他DLL文件里的函数等功能。
DLL是Dynamic Link Library的缩写,意为动态链接库。
DLL 是一个包含可由多个程序同时使用的代码和数据的库。DLL一般是封装了一些共享的例程和资源,它通常是一个可以被其它应用程序调用的程序模块。
DLL是不能被直接执行(不能单独运行)。只能被其它EXE或者动态链接库调用。在.NET中,可以通过创建类库的方式创建动态链接库。
在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。
通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。这有助于促进代码重用和内存的有效使用。
使用 DLL 的优点:
1、使用较少的资源
当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。
2、推广模块式体系结构
DLL 有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。
3、简化部署和安装
当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。
DLL 的类型
当您在应用程序中加载 DLL 时,可以使用两种链接方法来调用导出的 DLL 函数。这两种链接方法是加载时动态链接和运行时动态链接。
1、加载时动态链接
在加载时动态链接中,应用程序像调用本地函数一样对导出的 DLL 函数进行显式调用。要使用加载时动态链接,请在编译和链接应用程序时提供头文件 (.h) 和导入库文件 (.lib)。当您这样做时,链接器将向系统提供加载 DLL 所需的信息,并在加载时解析导出的 DLL 函数的位置。
2、运行时动态链接
在运行时动态链接中,应用程序调用 LoadLibrary 函数或 LoadLibraryEx 函数以在运行时加载 DLL。成功加载 DLL 后,可以使用 GetProcAddress 函数获得要调用的导出的 DLL 函数的地址。在使用运行时动态链接时,无需使用导入库文件
5.什么是强类型,什么是弱类型?哪种更好些?为什么?
强类型定义语言:一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。在编译的时候就确定类型的数据,在执行时类型不能更改。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。例如你有一个整数,如果不显式地进行转换,你不能将其视为一个字符串。强类型语言有:java、python、C++、,c#,pascal。
弱类型定义语言:数据类型可以被忽略的语言。一个变量可以赋不同数据类型的值。弱类型在执行的时候才会确定类型。例如:在vbscript中,可以将字符串 12 和整数 3 进行连接得到字符串 123,然后可以把它看成整数123,而不需要显式转换。弱类型语言有:vb、php、javascript、vb。
二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语言;弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言。
弱类型语言允许将一块内存看做多种类型。比如直接将整型变量与字符变量相加。C and C++ 是静态语言,也是弱类型语言;Perl and PHP 是动态语言,但也是弱类型语言。
强类型语言在没有强制类型转化前,不允许两种不同类型的变量相互操作。Java、C# 和 Python 等都是强类型语言。
使用哪种语言还是要按需而定。编写简单小应用,使用弱类型语言可节省很多代码量,有更高的开发效率。而对于构建大型项目,使用强类型语言可能会比使用弱类型更加规范可靠。
6.PID是什么?在做系统的故障排除时如何使用它?
PID是进程编号。PID = Process Identifier是一个全局唯一的用来标识进程的整数。在多任务系统中,可用来诊断系统中发生错误的进程。
在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visual studio.net等ide将故障进程附加到进程中进行调试(debug)
7.单个TCP/IP端口上能够侦听多少个进程?
可以为多个,多个为端口复用
看下面代码
Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket1.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"),8235));socket1.Listen(10);
socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socket2.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8235)); socket2.Listen(10);
Console.Read();
8.什么是GAC?它解决了什么问题?
Gloal Assembly Cache,全局应用程序集缓存。他的作用是可以存放一些有很多程序都要用到的公共Assembly,这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。
它解决了几个程序共享某一个程序集的问题。不必再将那个被共享的程序集拷贝到应用程序目录了。
举例:.net应用程序在加载的时候,会首先查看全局应用程序集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找。例如System.Data、System.Windows.Forms 等等。如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework \v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。
、中级.NET开发人员 20
1.阐述面向接口、面向对象、面向方面编程的区别
面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现,严格的来说,面向接口应该是面向对象中的一部分吧,因为面向对象也强调的是依赖倒置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现,更具比较的应该是面向接口与面向抽象对象,我的体会是面向接口更加灵活,但实现时候,稍微有些代码冗余。
面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共逻辑,再实现具体实现类。面向对象是对复杂问题的分解。
面向方面的编程是一种新概念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码模块化,而无法对和业务无关的代码模块化。而面向方面正是解决这一问题的方案,它的关键思想是"将应用程序中的商业逻辑与对其提供支持的通用服务进行分离"。
2.什么是Interface?它与Class有什么区别?
接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类。
3.什么是反射?
程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例.
4.使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?
Web服务使用的消息机制,而Remoting采用的RPC. Web Service能用于不同平台,不同语言,Remoting只适用于.Net。效率上Remoting高于Xml Web Service
Web 服务基础结构通过将 SOAP 消息映射到方法调用,为 Web 服务提供了简单的 API。通过提供一种非常简单的编程模型(基于将 SOAP 消息交换映射到方法调用),它实现了此机制。ASP.NET Web 服务的客户端不需要了解用于创建它们的平台、对象模型或编程语言。而服务也不需要了解向它们发送消息的客户端。唯一的要求是:双方都要认可正在创建和使用的 SOAP 消息的格式,该格式是由使用 WSDL 和 XML 架构 (XSD) 表示的 Web 服务合约定义来定义的。
. NET Remoting 为分布式对象提供了一个基础结构。它使用既灵活又可扩展的管线向远程进程提供 .NET 的完全对象语义。ASP.NET Web 服务基于消息传递提供非常简单的编程模型,而 .NET Remoting 提供较为复杂的功能,包括支持通过值或引用传递对象、回调,以及多对象激活和生命周期管理策略等。要使用 .NET Remoting,客户端需要了解所有这些详细信息,简而言之,需要使用 .NET 建立客户端。.NET Remoting 管线还支持 SOAP 消息,但必须注意这并没有改变其对客户端的要求。如果 Remoting 端点提供 .NET 专用的对象语义,不管是否通过 SOAP,客户端必须理解它们。
5.类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗?
Are the type system represented by XmlSchema and the CLS isomorphic?
这个问题比较模棱两可,首先要解释什么是XmlSchema类型系统,什么是CLS类型系统,和同构(isomorphic)都是什么意思。XmlSchema是一个特定的XML文档必须满足的一套标准。这些标准能够描述不同的数据类型。例如:一个XSD文件(XmlSchema的物理实例化)可能会有一个entry like。这意味着一个必须满足XSD文件架构的XML文件可能有一个entry like 21.33。xs:decimal是一种XmlSchema 数据类型。其他类型包括xs:Boolean,xs:Date,xs:int等等。
CLS是公共语言规范(Common Language Specification),它是任何.net 语言(C#,VB.net等)使用的一套数据类型。例如:一个C#程序可能有这么一行代码:
System.Double是一种CLS数据类型。其他的包括System.Int32,System.Boolean等。
那什么是同构(isomorphic)呢?这是真正模棱两可的地方。同构可以不严谨地理解为“有相似的外表但不同的内在”,或者可以理解为“一对一的相似”。如果你将同构理解为有相似的外表,那么这道题的答案是“有点儿”。例如xs:Boolean 和System.Boolean相似。如果你将同构理解为“一对一的相似”那么这道题的答案仍然是“有点儿”。每一个XmlSchema类型都和CLS类型有那么一点相似,反之亦然。
6.从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?
这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生
7.调用Assembly.Load算静态引用还是动态引用?
动态
8.何时使用Assembly.LoadFrom?何时使用Assembly.LoadFile?
呵呵,这个比较有意思,相比LoadFile,LoadFrom则显得不地道,因为它娶媳妇的时候,是让人家穿上嫁妆,坐上马车,还得带着人家的妹妹来,:)用它加载的是程序集,这就要求同时将此程序集所依赖的程序集加载进来。而LoadFile就地道的多,它是加载程序集文件的内容,只将传入参数的文件加载,不考虑程序集依赖,但如果有相同实现,但位置不同的文件用LoadFrom是不能同时加载进来的,而LoadFile却可以。由于LoadFile加载的是文件,所以调用它之后,可能因为缺少必要的依赖造成无法被执行
9.什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不同?
它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。
10.Assembly.Load("foo.dll"); 这句话是否正确?
错误,正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll"); (多谢 Tristan(Guozhijian)的提示更正)
11.做强签名的assembly与不做强签名的assembly有什么不同?
强签名的程序集可以做成com,而不做强签名的就不行,同样强签名程序集可以安装到GAC中,而不做强签名的确不能。
12.DateTime是否可以为null?
不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null
13.什么叫JIT?什么是NGEN?它们分别有什么限制和好处?
Just In Time 及时编译,它是在程序第一次运行的时候才进行编译,而NGEN是所谓的pre-jit,就是说在运行前事先就将生成程序集的本机镜像,并保存到全局缓存中,适用NGEN可以提高程序集的加载和执行速度,因为它可以从本机映像中还原数代码和数据结构,而不必像jit那样动态生成它们。感觉和缓存的道理大同小异。
14..NET CLR中一代的垃圾收集器是如何管理对象的生命周期的?什么叫非确定性终结?
15.Finalize()和Dispose()之间的区别?
Finalize()用于隐式释放资源,Dispose()用于显示释放资源 (Finalize()的确相当于C++中的析构函数(多谢Jeffrey Zhao提示更正)
16.using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的。
有用,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。不明白什么是确定性终结。
17.tasklist /m "mscor*" 这句命令是干嘛的?
列出所有使用了以" mscor"作为开头的dll或者exe的进程和模块信息。
18.in-proc和out-of-proc的区别
in-proc是进程内,进程内能共享代码和数据块。
out-of-proc是进程外,进程外的互操作需要用进程间通讯来实现。
19..NET里的哪一项技术能够实现out-of-proc通讯?
.Net Remoting技术或者WCF技术
20.当你在ASP.NET中运行一个组件时,它在Windows XP, Windows 2000, Windows 2003上分别跑在哪个进程里面?
Xp : aspnet_Wp.exe
Windows 2000 : aspnet_Wp.exe
Windows 2003 : w3wp.exe
C# 组件开发人员 10
1.什么时候使用override?什么时候使用new? 什么叫shadowing?
(重写父类的方法的时候用override以实现多态,如果父类中的方法不是virtual的也不是abstract的才使用new,shadowing不懂)
Overloads, Overrides, Overridable, Shadows
先是基本概念:
overloads(重载):与现有成员相同的名称来声明属性或方法,但参数列表与原始成员不同;
overrides(重写):将重写从基类继承的成员;
Overridable(可覆盖的):指定属性或过程可由派生类中同名的属性或过程进行重写;
shadows:隐藏基类中一个同名元素或一组重载元素。
Overloads
之前是一直很confuse,在VS里写代码的时候貌似都没用过overloads,后来查了资料才知道Overloads是VB.NET beta 版遗留下来的关键字,现在已经可以不用写了,仍然存在是为了兼容已有的beta版代码。 其基本用法如下:
Public Overloads Sub a()
Debug.Writeline("a()")
End Sub
Public Overloads Sub a(ByVal para1 As Integer)
Debug.Writeline("a(ByVal para1 As Integer)")
End Sub
Public Sub Demo()
a()
a(1)
End Sub
(此例说明Overloads的作用,就是允许同名函数的存在,前提是有不同的参数。)
在VS里,overloads很多时候都可以省略不写,不过在一些涉及继承方面的内容时,还是需要用到overloads的。在子类中我们希望添加一个重载方法,增强子类功能时候,亦即重载基类中地方法时,就需要用到Overloads. 如下例子:
'基类
Public Class Person
private mName as string
private mBirthday as Date
Public Property Name() as String
Get
Return mName
End Get
Set(Byval value as string)
mName = value
End Set
End Property
Public Property Birthday() as String
Get
Return mBirthday
End Get
Set(Byval value as string)
mBirthday = value
End Set
End Property
End Class
'子类
Public Class Employee
Inherts Person
Private mHireDate as Date
Private mSalary as Double
Private mNames as New Generic.Dictionary(of NameTypes,String)
Public Property Name(byval 1 as NameTypes) as String
Get
Return mNames(type)
End Get
Set(Byval value as string)
if mNames.ContainsKey(type) then
mNames.Item(type)=value
Else
mNames.Add(type,value)
end if
End Set
End Property
End Class
'(如果这里省略了Overload关键字,Name方法的信实现代码就会遮蔽原来的实现代码)
Overridable, Overrides and shadow
在.NET中实现多态有两种方式,覆盖(overrides)和投影(shadow),而投影又分为Shados by Name(就是我们一般用的shadows)和Shadows by
signature(参数序列).
Public Class TheBase
Public Overridable Sub a()
Debug.Writeline("TheBase")
End Sub
End Class
Public Class TheInherited
Inherits TheBase
Public Overrides Sub a()
Debug.Writeline("TheInherited")
End Sub
End Class
Public Class TheShadowed
Inherits TheInherited
Public Shadows Sub a()
Debug.Writeline("TheShadowed")
End Sub
End Class
'情况一:
Dim c As TheBase
c = New TheBase()
c.a() ' 输出 TheBase
c = New TheInherited()
c.a() ' 输出 TheInherited
c = New TheShadowed()
c.a() ' 输出 TheInherited
'情况二:
Dim c As TheInherited
c = New TheBase()
c.a() ' 错误!无效的转换。
c = New TheInherited()
c.a() ' 输出 TheInherited
c = New TheShadowed()
c.a() ' 输出 TheInherited
'情况三:
Dim c As TheShadowed
c = New TheBase()
c.a() ' 错误!无效的转换。
c = New TheInherited()
c.a() ' 错误!无效的转换。
c = New TheShadowed()
c.a() ' 输出 TheShadowed
此例说明Overridable、Overrides、Shadows的用法。
请注意TheBase里面的Overridable,如果没有这一句,后面类TheInherited将无法声明同名过程a(),而TheShadows仍然可以。
Overridable 的意思是:可以被重写的。默认情况下,似乎不能重写基类中方法的行为的,基类必须显式地使用Overridable关键字,指出允许重写地方法。
Overrides 的意思是:重写原来的,一般用于子类重写父类的方法。如果没有Overrides关键字,当实现一个与基类中某一方法同名同参数地方法时,会得到一个编译错误。
Shadows 的意思是: 指示该变量隐藏基类中的同名编程元素或重载元素集。任何类型的声明元素均可用其他任何类型来隐藏。隐藏的元素在隐藏它的派生类中不可用。仅可以在模块、命名空间或文件级中使用 Shadows。这意味着可以在源文件中或者在模块、类或结构内(但不在过程内)声明隐藏变量。如果指定了 Shadows,也可以省略Dim关键字。不能在同一变量声明中同时指定 Static 和 Shadows。
在运行的例子中我们可以清晰地看到,无论变量c的定义是什么,VB.NET都会尽量寻找到最后被定义的那个成员。也就是说,如果被重写了,那么就找“从变量类型开始,到这个变量所指对象实际上的类为止,最后一次被重写(Overrides)的那个成员”。(当然,如果找不到,那么还会往变量类型的祖先那个方向上去找。)
简单点讲就是说,无论c怎么定以,如果他指向的是一个TheBase,他就找“到TheBase为止最后一次被重写的那个Sub a()”。如果他指向的是一个TheInherited,就找“到TheInherited为止最后一次被重写的那个Sub a()”,也就是TheInherited里面的那个。
对于TheShadowed来说,情况稍微复杂一点:
由于TheShadowed里面所写的那个a()被声明为Shadows的,也就是说这个a()跟TheBase和TheInherited里面的没有关系,于是从变量c的基类(TheBase)开始找,一直找到变量所指对象的类型TheShadowed,发现变量c的类型(无论是TheBase还是TheInherited)里面的那个a()最后一次被重写是在TheInherited里面(注意:TheShadows里面的a()跟它没关系),于是只要c不是Dim .. As TheShadows,那么就会选择调用TheInherited里面的a()了。
override overload hide obscure shadow概念区别
1。一个实例方法可以覆写(override)在其超类中可访问到的具有相同签名的所有实例方法,VM 将基于实例的
运行期类型来选择要调用的覆写方法
2。一个域、静态方法或成员类型可以分别隐藏(hide)在其超类中可访问到的具有相同名字(对方法而言就是相同的方法签名)的所有域、静态方法或成员类型。隐藏一个成员将阻止其被继承
3。在某个类中的方法可以重载(overload)另一个方法,只要它们具有相同的名字和不同的签名。由调用所指定的重载方法是在编译期选定的
4。遮掩(obscure) 一个变量可以遮掩具有相同名字的一个类型(比如System的一个String类型和System.out中的System),只要它们都在同一个范围内:如果这个名字被用于变量与类型都被许可的范围,那么它将引用到变量上。相似地,一个变量或一个类型可以遮掩一个包。
例子:
public class Obscure {
static String System; // Obscures type java.lang.System
public static void main(String[ ] args) {
// Next line won't compile: System refers to static field
System.out.println(“hello, obscure world!”);
}
}
5。一个变量、方法或类型可以分别遮蔽(shadow)在一个闭合的文本范围内的具有相同名字的所有变量、方法或类型。如果一个实体被遮蔽了,那么你用它的简单名是无法引用到它的;根据实体的不同,有时你根本就无法引用到它
////////////////////////////////////////////////////////////现在举一个shadow的例子,注意哦,很重要
package com.yinbodotcc;
public class PrivateClass
{
public void sleep(String a)
{
System.out.println(".."+a);
}
public static void sleep2(String a)
{
System.out.println(".."+a);
}
public void call()
{
new Thread(){
public void run()
{
//从Thread 那里继承到匿名类中的sleep 方法遮蔽(shadow)
//了我们想要调用的sleep方法,所以直接sleep("hello")找不到匹配的,所以
//不可以,会编译出错的。
//这个时候需要用 PrivateClass.this 来修饰一下子
//想法,如果取一个不同的名字,则就没有这个问题了。
PrivateClass.this.sleep("3");
sleep2("4");
}
}.start();
new Thread(new Runnable(){
public void run(){
//下面可以的原因是由于,Runnable接口里面没有定义sleep函数
sleep("4");
}
}).start();
}
public static void main(String[] args)
{
PrivateClass p=new PrivateClass();
p.call();
}
}
2.解释virtual、sealed、override和abstract的区别
(virtual申明虚方法的关键字,说明该方法可以被重写,sealed说明该类不可被继承,override重写基类的方法,abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。)
new
new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换
基类版本。也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的
方法。
在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取
消此警告,并记录代之以派生版本这一事实。
Virtual
Virtual 关键字允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写非
虚方法,virtual关键字不可以与static、abstract、private、override一起使用。
Virtual关键字又是和override紧密不可分的,如果要实现Virtual方法就必须要使用override
或new关键字(new和override产生的机理不同)。
abstract
在类声明中使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在
抽象类中的成员必须通过从抽象类派生的类来实现。抽象类不能实例化。
抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且
在签名后没有大括号 ({ })。
sealed
密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。密封类不能被
继承。
当应用于方法或属性时,sealed修饰符必须始终与override一起使用。
Override
Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方
法具有相同的签名
3.Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d 解释这个字符串每个部分的重要性和作用
(程序集的名字、版本、Culture不知道,公钥,这些用于GAC中申明一个唯一的程序集)
一个程序集通常包括4个自定义属性,用来惟一识别程序集,它们是文件名(无扩展名)、版本号、区域性标识和公钥标记,比如:
"Hello, version=
其中publicKeyToken是公钥的64位散列值,可以唯一标识程序集,拥有公钥标记的程序集称为强名称程序集,强名称程序集可以防篡改;可以安装到GAC中,为多个程序集所共享;还可以实施版本策略(不同版本的强名称程序集被认为是不同的程序集)。而公钥标记为空的程序集只能存在于所引用的程序集的目录以及子目录中,也无法实施版本策略(引用它的程序集会忽略版本号)。
4.解释public、protected、private和internal的区别
public可被内外访问
protected只能被内部和之类访问
private只能内部访问
internal只能在该程序集中被访问
5.使用Primary Interop Assembly (PIA)有什么好处?
反射,为测试方法加了Attribute
6.NUnit是通过什么机制获知需要测试哪些方法的?
(将发生的异常对象抛出,另一个只是抛出异常,并没有抛出原异常对象)
7.catch(Exception e){throw e;}和catch(Exception e){throw;}的区别
8.typeof(foo)和myFoo.GetType()的区别?
9.public class c{ public c(string a) : this() {;}; public c() {;} } 解释第一个构造函数中发生了什么?这个构造函数有什么用?
(第一个构造函数调用了第二个构造函数,这个构造函数构造了一个c对象的实例。)
10.this是干嘛用的?能够用在static方法中?
高级开发人员/架构师 25
1.DateTime.Parse(myString); 这行代码有什么问题?
有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse()
2.PDB是什么东西? 在调试中它应该放在哪里?
PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。
3.什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?
一种代码复杂度的衡量标准,中文名称叫做圈复杂度。在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度 大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。
控制流图是McCabe复杂度计算的基础,McCabe度量标准是将软件的流程图转化为有向图,然后以图论的知识和计算方法来衡量软件的质量。 McCabe复杂度包括圈复杂度(Cyclomatic complexity)、基本复杂度、模块涉及复杂度、设计复杂度和集成复杂度等。控制流程图分析是一个静态的分析过程,它提供静态的度量标准技术,一般主要运用在白盒测试的方法中。
控制流图的一个重要性质是它的可规约性(reducibility)。如果程序中不存在从循环外跳到循环内的goto语句,那么这个程序对应的控制流图是可规约的(reducible),反之这个控制流图就是不可规约的(irreducible)。因此,模块符合结构化程序设计的准则是控制流图可规约的基础。
程序环路复杂性也即为McCabe复杂性度量,它一般常用圈复杂度来描述,记录为V(G)。它用来衡量一个程序模块所包含的判定结构的复杂程度,数量上表 现为独立路径的条数,即合理地预防错误所需测试的最少路径条数,圈复杂度大的程序,说明其代码可能质量低且难于测试和维护。经验表明,程序的可能存在的 Bug数和圈复杂度有着很大的相关性
圈复杂度的计算方法很简单,计算公式为:V(G)=e-n+2。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量。其实,圈复杂度的计算还有 更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数,对应的计算公式 为:V(G)=区域数=判定节点数+1。
对于多分支的CASE结构或IF-ELSEIF-ELSE结构,统计判定节点的个数时需要特别注意一点,要求必须统计全部实际的判定节点数,也即每个 ELSEIF语句,以及每个CASE语句,都应该算为一个判定节点。判定节点在模块的控制流图中很容易被识别出来,所以,针对程序的控制流图计算圈复杂度 V(G)时,最好还是采用第一个公式,也即V(G)=e-n+2;而针对模块的控制流图时,可以直接统计判定节点数,这样更为简单。
4.写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查",
lock的使用
public void LockTest()
{
Object lockObj = new Object();
lock (lockObj)
{
//
}
}
5.什么叫FullTrust?放入GAC的assembly是否是FullTrust的?
FullTrust完全信任。
放入GAC中的Assembly是否FullTrust我的理解不是。
我理解FullTrust是可以通过代码设定的
6.代码加上需要安全权限的特性有什么好处?
可以更加灵活的设置对代码的访问权限,实现代码级保护。?这点不是特清楚,有明白的给讲解下
7.gacutil /l | find /i "Corillian" 这句命令的作用是什么?
全局程序集缓存中如果有Corillian就更新该程序集,没有就安装
8.sn -t foo.dll 这句命令是干嘛的?
显示程序集foo.dll的公钥标记
9.DCOM需要防火墙打开哪些端口?端口135是干嘛用的?
135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定,有关内容我在http://www.cnblogs.com/jillzhang/archive/
10.对比OOP和SOA,它们的目的分别是什么?
我想OOP和SOA应该没有对比性吧。OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态 。而SOA是一个技术框架,技术框架和编程模型应该说不是
11.XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.
12.为什么不提倡catch(Exception)?
原因可能有两点:1)try..catch在出现异常的时候影响性能 2)应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等
13.Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。
14.Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略
15.JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?
方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么
16.对比抽象基类和接口的使用
抽象类能有具体实现,而接口只定义行为规范,不能有具体实现。一个类只能继承一个父类,但能实现多个接口。
17.a.Equals(b)和a == b一样吗?
不一样。a.Equals(b)表示a与b一致, a==b表示a与b的值相等
18.在对象比较中,对象一致和对象相等分别是指什么?
对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同
19.在.NET中如何实现深拷贝(deep copy)?
实现IClonable接口
20.请解释一下IClonable
IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().
深度复制(Deep Copy)与浅表复制(Shadow Copy)的比较
public class Name
{
public string FirstName;
public string LastName;
}
public class Person:ICloneable
{
public Name PersonName;
public string Email;
/**//// <summary>
/// Deep Copy的例子
/// </summary>
/// <returns> </returns>
public Object Clone()
{
Person p = new Person();
p.Email = this.Email;
p.PersonName = new Name();
p.PersonName.FirstName = this.PersonName.FirstName;
p.PersonName.LastName = this.PersonName.LastName;
return p;
}
public void ChangLastName(string lastName)
{
this.PersonName.LastName = lastName;
}
public static void Main()
{
Person p = new Person();
p.PersonName = new Name();
p.PersonName.LastName = "jill";
p.PersonName.FirstName = "zhang";
p.Email = "jillzhang@126.com";
Person sameNamePerson = p.Clone() as Person;
sameNamePerson.ChangLastName("clr_");
Console.WriteLine(p.PersonName.LastName);
Console.WriteLine(sameNamePerson.PersonName.LastName);
Person samePerson = p.MemberwiseClone() as Person;
samePerson.ChangLastName("Shadow");
Console.WriteLine(p.PersonName.LastName);
Console.WriteLine(sameNamePerson.PersonName.LastName);
Console.Read();
}
}
21.什么叫装箱?
装箱(boxing)是将值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程。
拆箱(unboxing)是将饮用类型数据转换值类型,比如int j = (int)o;属于拆箱。
22.string是值类型还是引用类型?
引用类型
23.XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。
24.为什么不应该在.NET中使用out参数?它究竟好不好?
我挺喜欢用out参数的,特别是当函数需要有多于1个返回的时候,我比较愿意用out,
25.特性能够放到某个方法的参数上?如果可以,这有什么用?
可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。
对方法的参数设置Attribute的例子
[AttributeUsage(AttributeTargets.Parameter)]
public class ParameterAtt : Attribute
{
public int Min = 100;
}
public class AttributeTest
{
public void TestMethod([ParameterAtt(Min = 100)] int par1)
{
ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0];
ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt)) as ParameterAtt;
if (att.Min > par1)
{
throw new Exception("要求para1最小为" + att.Min);
}
}
}
ASP.NET (UI)开发人员 21
1.阐述一个基于浏览器的Form POST如何变成一个服务器端的事件,如Button1_OnClick。
2.什么是PostBack?
浏览器端传递数据到服务器的时候,服务器检查时候有_Viewstate是否存在,如果存在,就会在
isPostBack中返回true。
IPostBackDataHandler接口定义此控件需要返回(Post回)值,并填回控件。在客户端,例如textbox控件等生成的html会在浏览器以Post方式回发服务器的时候在参数中提交控件的value,aps.net对于实现了此接口的控件,会自动从Post来的http参数中获取控件的value,并且调用此接口的LoadPostData函数通知控件处理(填写到自己的实例中),并且这个函数如果返回true还会在page_load事件结束后触发此控件的RaisePostDataChangedEvent方法,这通常就是控件包装成的 xxxChanged 或者 xxxClicked 事件。程序员直接在这些最终事件上写程序,其实就是由这个机制由asp.net控制的。
IPostBackEventHandler接口则定义除了上面Post上来数据以外的控件“自定义”客户端事件。页面使用 Page.GetPostBackEventReference 等函数输出的脚本命令可以直接被asp.net调用此控件的RaisePostBackEvent方法。例如一个会计凭证控件具有此接口,如果你希望点击一个对象触发它的“记账”功能,就可以这样写代码:
Ctr.Attributes.Add("onclick",Page.GetPostBackEventReference(凭证,"记账"))
它运行时就会在Ctr中输出类似 __doPostBack('ctr0_ctr_1','记账') 的命令,并且点击此Ctr会触发会计凭证的记账事件。
3.什么是ViewState? 它是否被编码过? 是否被加密过?谁会使用ViewState?
viewstate是存储在客户端的隐藏信息,当服务器接受请求回传时可以将viewstate内容回传到页面中,其机制可自动实现,控件的属性中都有viewstate,只需将其设置为true即可,就可以保存控件信息.
session是客户端会话,具体应用举例:比如你进入淘宝网,购物,当你选中欲购买的产品时,你点下一页按钮进入另外另一个页,那么如何存储这些表格信息呢,就可以用到session(tableid)了,这样session就可以存储你前一页选的产品表格了,然后这一页又选了哪些产品,你可以把这些新的记录集再加入老的表格中,最后产生新表,并存储在session中,Session变量又可被下一页面调用最后在用户购买单中就可以调用最终session,产生表格,提交购物.
当aspx页面重新加载后,上一次的存放在变量中的数据就会丢失的。
用ViewState来保存
如ViewState["aaa"]="要保存的值";
下次读取的时候可以先用if(ViewState["aaa"]==null)来判断一下是否有值
ViewState["aaa"]获得是object类型的,用的时候转一下先
Session是服务器的内存中,最大10KB,默认20分钟释放。
ViewState只能在一个页面上传值,session可跨多个页面传值
ViewState只是在当前page内有效,关了当前页,再重新打开,ViewState就没了的。
为了在 HTTP 请求间保留这些值,ASP.NET 服务器控件使用该属性(它是 StateBag 类的实例)来
存储属性值。在处理后续请求时,该值随即作为变量传递给 HTML 隐藏输入元素。
4.<machinekey>元素是干嘛用的?它用于哪两项ASP.NET技术?
配置用于加密和解密 Forms 身份验证 Cookie 数据和视图状态数据的密钥,以及配置用于验证进程外会话状态标识的密钥。此节可以在计算机、站点或应用程序级别进行声明,但不能在子目录级别声明。
machineKey的作用在于下述场景:
· ASP.net 使用 forms authentication 时的 cookie 数据的加密和解密。以确保这部分数据不会被篡改。
· viewstate 数据的加密和解密。以确保这部分数据不会被篡改。
· 使用进程外session(out-of-process session)时,对会话状态标识进行验证。
5.说出ASP.NET 1.1中的3种Session State提供程序以及它们的优缺点?
附件!!!!!!!!!!!!!!
6.什么叫Web Gardening? 在设计中如何使用它?
Web Garden:IIS6 Web Garden 指的是一个应用程序可以成多个进程(w3wp.exe)来执行,一次请求使用其中的一个。用这个的主要目的是提高程序的可用性。当其中一个进程发生错误,那么也不会影响其他进程。发生错误的进程可以根据规则关闭,而其他的进程则可以继续工作。(引用别人滴,俺自己还没理顺怎么解释它。)
IIS 6.0 Web园(Web Garden)
IIS 6.0允许将应用程序池配置成一个Web园(Web Garden)。要理解Web园的概念,可以设想这样一种情形:假设有一个IIS 5.0服务器和三个Web网站,每一个Web网站运行着相同的应用程序,如果IIS 5.0能够自动按照圆形循环的模式将请求依次发送给这些功能上等价、实际上分离的Web网站,将负载分离到三个不同的进程,就可以构成一个小型的Web农场(Web Farm)——这就是Web园。
在IIS 6.0的Web园中,我们不必创建额外的Web网站,只要指定用于某个应用程序池的工作进程的数量就可以了。具体的配置步骤是:打开应用程序池的“属性”对话框,转到“性能”页,在“Web园”下面的“最大工作进程数”输入框中输入进程数量,如图八。当服务器的负载较小,不需要额外的工作进程时,IIS 6.0在一定的时间后(默认20分钟,可配置)自动缩减实际的工作进程数量;如果负载变大,需要额外的工作进程,IIS 6.0再次增加工作进程数量。这一切操作都自动进行,不需要管理员干预。
Web园:在Web园中你可以配置此应用程序池所使用的最大工作进程数,默认为1,最大可以设置为4000000; 配置使用多个工作进程可以提高该应用程序池处理请求的性能,但是在设置为使用多个工作进程之前,请考虑以下两点:
每一个工作进程都会消耗系统资源和CPU占用率;太多的工作进程会导致系统资源和CPU利用率的急剧消耗;
每一个工作进程都具有自己的状态数据,如果Web应用程序依赖于工作进程保存状态数据,那么可能不支持使用多个工作进程。
问: IIS 6.0 具有一个名为 Web 园的新功能,有了它,可以将应用程序池配置为使用多个工作进程。IIS 何时创建额外的工作进程?在我们实施 Web 园之前,我们应该了解哪些知识?
答:在您创建应用程序池时,就会通知 IIS 6 创建一个工作进程,以传送指派给该应用程序池的 Web 站点、文件和文件夹的内容。您可以将应用程序池配置为启动多个,而非一个工作进程,这样可以提高可扩展性。这个功能的名为 Web 园,是小型的“Web 农场”。您无需使用多台计算机来传送相同的内容(Web 农场),而是可以使用一台计算机中的多个进程来传送相同的内容。
在将 IIS 6 应用程序配置为 Web 园时,您只需在“应用程序池属性”的“性能”选项卡的“最大工作进程数”框中,设置一个大于 1 的工作进程数。如果这个值大于 1,每个请求都将启动一个新的工作进程实例,可启动的最多进程数为您所指定的最大工作进程数。后续的请求将以循环的方式发送至工作进程。
Web 园在您的应用程序资源有限的情况下非常有用。例如,如果您到数据库的连接很慢,那么您可以使用多个工作进程来增加用户吞吐量,从而增加到数据库的连接数。
尽管在有些情况下使用 Web 园的用处非常大,但是要注意,每个工作进程的会话信息都是唯一的。由于请求以循环的方式路由到应用程序池工作进程,因此 Web 园对于会话信息存储在进程中的应用程序作用可能不大。在少数情况下,让多个工作进程运行同一个应用程序会造成资源竞争。例如,如果所有工作进程都试图将信息记录到日志文件中,或是使用那些不是专用于多个并发访问的资源,那么可能出现资源竞争问题。
如果不存在这些问题,那么 Web 园可能正是您所需的功能之一,而且其作用会非常大。
7.假设有一个ASP.NET应用程序,那么单独一个进程中允许多少应用程序对象?那两个进程呢?启用了Web Gardening的2个进程呢?这对设计有何影响?
8.ASP.NET会重用多个请求之间的线程吗?是否每个HttpRequest都有自己的线程?你是否应该用ASP.NET的Thread Local存储?
9.[ThreadStatic]属性在ASP.NET中有用吗?它有没有副作用?是好是坏?
标记为 ThreadStaticAttribute 的静态(在 Visual Basic 中为 Shared)字段不在线程之间共享。每个执行线程都有单独的字段实例,并且独立地设置及获取该字段的值。如果在不同的线程中访问该字段,则该字段将包含不同的值。
注意 不要为标记为 ThreadStaticAttribute 的字段指定初始值,因为这样的初始化只会发生一次,因此在类构造函数执行时只会影响一个线程。在不指定初始值的情况下,如果它是值类型,可依赖初始化为其默认值的字段,如果它是引用类型,则可依赖初始化为空引用(Visual Basic 中为 Nothing)的字段。
class Program
{
[ThreadStatic] static int i;
static Random r = new Random();
public static void ThreadProc()
{
i = r.Next(1, 10);
while (true)
{
Console.WriteLine("{0}:{1}", Thread.CurrentThread.Name, i);
Thread.Sleep(500);
}
}
public static void
{
for (int i = 0; i < 2; i++)
{
Thread t = new Thread(new ThreadStart(ThreadProc));
t.Name = "T" + i.ToString();
t.Start();
}
Console.WriteLine("Press Enter key to exit...");
Console.ReadLine();
}
}
前两天写了几篇关于static Member的帖子。Steeven提到ThreadStaticAttribute属性。这个咚咚我还真的没有见过呢。
今天翻了一下Msdn,提到使用这个属性修饰的static Member是一个线程一份而不是整个进程中一份。在我的印象中以为static 就是全进程唯一的呢
还有提到,对于threadstatic变量,不要给初值。因为初值只会初始化一次。而多个线程中的多个值就不一定是哪个被初始化。但是可以依赖该类型的默认值。
btw:有人认为msdn中有的东西就不要写了,我认为不是。MSDN这么大,当字典用还可以。那么多的东西一个人哪能知道的全。遇到有意思,或平常不常见的东西。写到blog中。有人看了最少就会知道“哦!还有这个咚咚,去查查看”。一个盲点就是这样去掉的
10.如何使用HttpHandler简化现有的为.aspx页面提供验证图片的设计
学习附件!
11.HttpModule订阅的是什么类型的事件? 这对于实现有何影响?如果不打算重新编译ASP.NE应用程序,应该怎么做?
学习附件再说
12.说出表示任意一个终端(URL)的方式,以及ASP.NET中把请求路由到那个终点的方式
13.解释cookie的工作原理。给出一个滥用Cookie的例子。
附件。
14.解释HttpRequest.ValidateInput()的重要性?
HttpRequest 类使用输入验证标志来跟踪是否对通过 Cookies、Form 和 QueryString 属性访问的请求集合执行验证。
ValidateInput 方法设置这些标志,以便在调用 Cookies、Form 或 QueryString 属性的 get 访问器时执行输入验证。验证的工作原理是,将所有输入数据与具有潜在危险的数据的硬编码列表进行对照检查。
15.哪些数据是通过HTTP Header传递的?
16.对比HTTP动词GET和POST? 什么是HEAD?
HTTP请求:GET与POST方法的区别
HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和 幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解);
在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
HTTP-GET和HTTP-POST
HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每个HTTP-GET和HTTP-POST都由一系列HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么,而响应则是由一系列HTTP应答头和应答数据组成,如果请求成功则返回应答。
HTTP-GET以使用MIME类型application/x-www-form-urlencoded的urlencoded文本的格式传递参数。Urlencoding是一种字符编码,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。附加参数还能被认为是一个查询字符串。
与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。
Get 和 Post 的区别两点:
一、这两者传递参数时所用的编码不一定是一样的。在 Tomcat 中似乎 Get 的编码方式是根据页面中指定的编码方式,而 Post 则是一直使用同一种编码方式,可在 Tomcat 的 server.xml 中配置。
二、使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。
所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
表单提交中get和post方式的区别归纳如下几点:
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。
此篇文章为转载,只用于个人学习,不涉及任何商业用途和盈利目的.
1.HTTP请求格式:
<request line>
<headers>
<blank line>
[<request-body>]
在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。
2.GET与POST区别
HTTP定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST.
HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每个HTTP-GET和HTTP-POST都由一系列HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么,而响应则是由一系列HTTP应答头和应答数据组成,如果请求成功则返回应答。
HTTP-GET以使用MIME类型application/x-www-form-urlencoded的urlencoded文本的格式传递参数。Urlencoding是一种字符编码,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。附加参数还能被认为是一个查询字符串。
与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。
(1)get是从服务器上获取数据,post是向服务器传送数据。
(1) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(2) 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
(2) GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(3) 安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
注:所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说,GET 请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。
下面举一个简单的例子来说明它们的区别:
<!-分别通过get和post方式提交表单-->
<FORM ACTION="getpost.asp" METHOD="get">
<INPUT TYPE="text" NAME="Text" VALUE="http://wxf0701.cnblogs.com//>
<INPUT TYPE="submit" VALUE="Get方式"></INPUT>
</FORM>
<BR>
<FORM ACTION="getpost.asp" METHOD="post">
<INPUT TYPE="text" NAME="Text" VALUE="http://wxf0701.cnblogs.com/>
<INPUT TYPE="submit" VALUE="Post方式"></INPUT>
</FORM>
<BR>
<% If Request.QueryString("Text") <> "" Then %>
通过get方式传递的字符串是: "<B><%= Request.QueryString("Text") %></B>"<BR>
<% End If %>
<% If Request.Form("Text") <> "" Then %>
通过Post方式传递的字符串是: "<B><%= Request.Form("Text") %></B>"<BR>
<% End If %>
17.说出至少6个HTTP状态码以及它们的含义
附件!!!
18.if-not-modified-since的工作原理是什么? 用ASP.NET如何实现它?
19.解释 <@OutputCache%>和如何使用VaryByParam、VaryByHeader.
20.VaryByCustom是如何工作的?
21.如何通过q=? (除了q=5)来实现ASP.NET HTML输出缓冲和缓冲过期(比如http://localhost/page.aspx?q=5)?
XML开发人员 16
XML命名空间的作用?
1. 何时适合使用DOM?何时不适合?有没有尺度限制?
2.什么是WS-I基本配置?它重要在哪里?
3.写一个小XML文档,其中使用的是默认的命名空间,以及一个合法的(前缀)命名空间,其中要有分别属性这两个命名空间的元素
4.元素和特性的基本区别在哪里?
5.格式完好的XML和有效的XML有什么区别?
6..NET中如何验证XML?
7.myXmlDocument.SelectNodes("//mynode"); 为什么这句代码不好?什么时候它是好的?
8.拉式解析(XmlReader)与事件读取器(Sax)的区别
9.XPathDocument和XmlDocument的区别? 在何种情况下应该用哪一个?
10.“XML片断”与“XML文档”有什么区别
11.什么叫格式规范的XML?
12.XML InfoSet规范与Xml DOM有什么不同? InfoSet是要解决什么问题?
13.比较DTD和XSD,它们的相似点与区别分别是什么?哪个更好些?为什么?
14.System.Xml支持DTD吗?如果支持,如何使用?
XML作为一门标记语言,它就需要一种文档(即文档类型定义DTD)来定义,DTD可以看作是一类XML文档的模板。它定义了文档的逻辑结构,规定了XML文档中所使用的元素,实体,元素的属性,元素与实体之间的关系。它使得数据交流与共享得以正常进行,验证了数据的有效性。DTD可以是一个完全独立的文件,也可以在XML文件中直接设定。所以,DTD分为外部DTD(在XML文件中调用另外已经编辑好的DTD)和内部DTD(在XML文件中直接设定DTD)两种。在一些有相互业务往来的公司,如果他们使用的电子文档是XML文档,那么我们就可以定用一个独立的DTD文档。每次交换和定义时都引用它来验证结构完整性和语法的合法性。
15.XML Schema能够表示为对象图?对象图能够表示为XML Schema?