基础知识,面试题,牛人博弈IT

并发进程由于共享系统内部资源,因此导致进程执行速度上的制约,这种制约分为:间接制约与直接制约。间接制约引起进程之间的互斥执行,直接制约引起进程间的同步执行。例如一个家里如果只有一个卫生间,卫生间这个公有资源使得每个人只能互斥使用它,这就是间接制约。而直接制约是指并发进程各自执行的结果互为对方的执行条件,例如司机与售票员的关系,当司机到站停车后,售票员才能开门,而只有售票员关门后,司机才能开车,他们之间是同步的。进程的互斥与同步可以很好的通过信号量和PV原语来实现。通过读一些同步与互斥的例子,你会体会到PV原语的精妙,也会感到一种乐趣。并发进程的资源竞争不当还会导致死锁现象。

理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32多线程上下的功夫。

因此,学习Win32多线程不仅对理解Win32本身有重要意义,而且对学习和领会其它操作系统也有触类旁通的作用。

进程与线程

先阐述一下进程和线程的概念和区别,这是一个许多大学老师也讲不清楚的问题。

进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。

线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

根据进程与线程的设置,操作系统大致分为如下类型:

(1)单进程、单线程,MS-DOS大致是这种操作系统;

(2)多进程、单线程,多数UNIX(及类UNIX的LINUX)是这种操作系统;

(3)多进程、多线程,Win32(WindowsNT/2000/XP等)、Solaris2.x和OS/2都是这种操作系统;

(4)单进程、多线程,VxWorks是这种操作系统。

在操作系统中引入线程带来的主要好处是:

(1)在进程内创建、终止线程比创建、终止进程要快;

(2)同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。另外,线程的出现还因为以下几个原因:

(1)并发程序的并发执行,在多处理环境下更为有效。一个并发程序可以建立一个进程,而这个并发程序中的若干并发程序段就可以分别建立若干线程,使这些线程在不同的处理机上执行。

(2)每个进程具有独立的地址空间,而该进程内的所有线程共享该地址空间。这样可以解决父子进程模型中,子进程必须复制父进程地址空间的问题。

(3)线程对解决客户/服务器模型非常有效。

WindowsService是一种可随Windows操作系统启动而启动的,在后台运行的,通常不和用户产生交互的程序。它无法通过双击来运行,类似于Unix守护进程(daemonprocesses),当用户注销时它也不会停止。

Windows服务由三部分组成:1.一个服务可执行文件;2.一个服务控制程序(SCP);3.服务控制管理器(SCM),负责在HKLM\SYSTEM\CurrentControlSet\Services下创建服务键值。用户可通过SCP控制服务的启动、停止、暂停等,SCP会通过SCM调用服务程序。

Window标准的exe可执行程序通常有一个用户界面,Console或GUI,通常由用户来启动或停止。

这个需要针对硬件平台,公式为单个进程能访问的最大内存量=2的处理器位数次方/2,比如通常情况下,32位处理器下,单个进程所能访问的最大内存量为:2的32次方/2=2G。单个进程能访问的最大内存量是最大虚拟内存的1/2,因为要分配给操作系统一半虚拟内存。

32位Windows上单个进程所能访问的最大内存量是4G,单由于操作系统需要给系统核心分配2G的空间,所以一般用户程序的进程可使用的最大内存为2G。

不一定一样,32位的操作系统的进程可访问的最大内存量是4G,这4G包含了虚拟内存,而一个进程可访问的最大内存量也是4G,所以进程内存访问量在物理内存大于等于4G的时候跟虚拟内存无关,而当物理内存小于4G时,进程访问的内存量随着虚拟内存的增加而增加,直到4G。

EXE是可以单独运行的程序,DLL是不能单独运行,一般是由EXE程序来调用DLL的函数

DLL一般是封装了一些共享的例程和资源,它通常是一个可以被其它应用程序调用的程序模块。一般扩展名为dll。它与EXE有些类似,但动态链接库不能被直接执行,只能被其它EXE或者动态链接库调用。在.NET中,可以通过创建类库的方式创建动态链接库。

EXEFile可执行程序。

一种可在操作系统存储空间中浮动定位的可执行程序。MS-DOS和MS-WINDOWS下,此类文件扩展名为.exe。

WINDOWS操作系统中的二进制可执行文件,可执行文件分两种一种是后辍名为.COM另一种就是.EXE了。.COM一般用于DOS,在WINDOWS系统中的执行文件一般都是.EXE文件。

EXE是可以单独运行的程序。EXE里含有程序的执行入口,比如说Main()函数。EXE文件可以调用其他DLL文件里的函数等功能。

DLL是DynamicLinkLibrary的缩写,意为动态链接库。

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函数的地址。在使用运行时动态链接时,无需使用导入库文件

强类型定义语言:一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。在编译的时候就确定类型的数据,在执行时类型不能更改。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。例如你有一个整数,如果不显式地进行转换,你不能将其视为一个字符串。强类型语言有:java、python、C++、,c#,pascal。

弱类型定义语言:数据类型可以被忽略的语言。一个变量可以赋不同数据类型的值。弱类型在执行的时候才会确定类型。例如:在vbscript中,可以将字符串12和整数3进行连接得到字符串123,然后可以把它看成整数123,而不需要显式转换。弱类型语言有:vb、php、javascript、vb。

二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语言;弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言。

弱类型语言允许将一块内存看做多种类型。比如直接将整型变量与字符变量相加。CandC++是静态语言,也是弱类型语言;PerlandPHP是动态语言,但也是弱类型语言。

强类型语言在没有强制类型转化前,不允许两种不同类型的变量相互操作。Java、C#和Python等都是强类型语言。

使用哪种语言还是要按需而定。编写简单小应用,使用弱类型语言可节省很多代码量,有更高的开发效率。而对于构建大型项目,使用强类型语言可能会比使用弱类型更加规范可靠。

PID是进程编号。PID=ProcessIdentifier是一个全局唯一的用来标识进程的整数。在多任务系统中,可用来诊断系统中发生错误的进程。

在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visualstudio.net等ide将故障进程附加到进程中进行调试(debug)

可以为多个,多个为端口复用

看下面代码

Socketsocket1=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

Socketsocket2=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

socket1.Bind(newIPEndPoint(IPAddress.Parse("127.0.0.1"),8235));socket1.Listen(10);

socket2.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);

socket2.Bind(newIPEndPoint(IPAddress.Parse("127.0.0.1"),8235));socket2.Listen(10);

Console.Read();

GloalAssemblyCache,全局应用程序集缓存。他的作用是可以存放一些有很多程序都要用到的公共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的升级和版本控制。

面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共逻辑,再实现具体实现类。面向对象是对复杂问题的分解。

接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类。

程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例.

Web服务使用的消息机制,而Remoting采用的RPC.WebService能用于不同平台,不同语言,Remoting只适用于.Net。效率上Remoting高于XmlWebService

Web服务基础结构通过将SOAP消息映射到方法调用,为Web服务提供了简单的API。通过提供一种非常简单的编程模型(基于将SOAP消息交换映射到方法调用),它实现了此机制。ASP.NETWeb服务的客户端不需要了解用于创建它们的平台、对象模型或编程语言。而服务也不需要了解向它们发送消息的客户端。唯一的要求是:双方都要认可正在创建和使用的SOAP消息的格式,该格式是由使用WSDL和XML架构(XSD)表示的Web服务合约定义来定义的。.NETRemoting为分布式对象提供了一个基础结构。它使用既灵活又可扩展的管线向远程进程提供.NET的完全对象语义。ASP.NETWeb服务基于消息传递提供非常简单的编程模型,而.NETRemoting提供较为复杂的功能,包括支持通过值或引用传递对象、回调,以及多对象激活和生命周期管理策略等。要使用.NETRemoting,客户端需要了解所有这些详细信息,简而言之,需要使用.NET建立客户端。.NETRemoting管线还支持SOAP消息,但必须注意这并没有改变其对客户端的要求。如果Remoting端点提供.NET专用的对象语义,不管是否通过SOAP,客户端必须理解它们。

ArethetypesystemrepresentedbyXmlSchemaandtheCLSisomorphic

这个问题比较模棱两可,首先要解释什么是XmlSchema类型系统,什么是CLS类型系统,和同构(isomorphic)都是什么意思。XmlSchema是一个特定的XML文档必须满足的一套标准。这些标准能够描述不同的数据类型。例如:一个XSD文件(XmlSchema的物理实例化)可能会有一个entrylike。这意味着一个必须满足XSD文件架构的XML文件可能有一个entrylike21.33。xs:decimal是一种XmlSchema数据类型。其他类型包括xs:Boolean,xs:Date,xs:int等等。

CLS是公共语言规范(CommonLanguageSpecification),它是任何.net语言(C#,VB.net等)使用的一套数据类型。例如:一个C#程序可能有这么一行代码:

System.Double是一种CLS数据类型。其他的包括System.Int32,System.Boolean等。

那什么是同构(isomorphic)呢?这是真正模棱两可的地方。同构可以不严谨地理解为“有相似的外表但不同的内在”,或者可以理解为“一对一的相似”。如果你将同构理解为有相似的外表,那么这道题的答案是“有点儿”。例如xs:Boolean和System.Boolean相似。如果你将同构理解为“一对一的相似”那么这道题的答案仍然是“有点儿”。每一个XmlSchema类型都和CLS类型有那么一点相似,反之亦然。

这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生

动态

呵呵,这个比较有意思,相比LoadFile,LoadFrom则显得不地道,因为它娶媳妇的时候,是让人家穿上嫁妆,坐上马车,还得带着人家的妹妹来,:)用它加载的是程序集,这就要求同时将此程序集所依赖的程序集加载进来。而LoadFile就地道的多,它是加载程序集文件的内容,只将传入参数的文件加载,不考虑程序集依赖,但如果有相同实现,但位置不同的文件用LoadFrom是不能同时加载进来的,而LoadFile却可以。由于LoadFile加载的是文件,所以调用它之后,可能因为缺少必要的依赖造成无法被执行

它不是一个文件名,相比文件名,AssemblyQualifiedName(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。

强签名的程序集可以做成com,而不做强签名的就不行,同样强签名程序集可以安装到GAC中,而不做强签名的确不能。

不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null

JustInTime及时编译,它是在程序第一次运行的时候才进行编译,而NGEN是所谓的pre-jit,就是说在运行前事先就将生成程序集的本机镜像,并保存到全局缓存中,适用NGEN可以提高程序集的加载和执行速度,因为它可以从本机映像中还原数代码和数据结构,而不必像jit那样动态生成它们。感觉和缓存的道理大同小异。

有用,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。不明白什么是确定性终结。

列出所有使用了以"mscor"作为开头的dll或者exe的进程和模块信息。

in-proc是进程内,进程内能共享代码和数据块。

out-of-proc是进程外,进程外的互操作需要用进程间通讯来实现。

.NetRemoting技术或者WCF技术

Xp:aspnet_Wp.exe

Windows2000:aspnet_Wp.exe

Windows2003:w3wp.exe

(重写父类的方法的时候用override以实现多态,如果父类中的方法不是virtual的也不是abstract的才使用new,shadowing不懂)

先是基本概念:

overrides(重写):将重写从基类继承的成员;

Overridable(可覆盖的):指定属性或过程可由派生类中同名的属性或过程进行重写;

shadows:隐藏基类中一个同名元素或一组重载元素。

Overloads

之前是一直很confuse,在VS里写代码的时候貌似都没用过overloads,后来查了资料才知道Overloads是VB.NETbeta版遗留下来的关键字,现在已经可以不用写了,仍然存在是为了兼容已有的beta版代码。其基本用法如下:

PublicOverloadsSuba()Debug.Writeline("a()")EndSubPublicOverloadsSuba(ByValpara1AsInteger)Debug.Writeline("a(ByValpara1AsInteger)")EndSubPublicSubDemo()a()a(1)EndSub

(此例说明Overloads的作用,就是允许同名函数的存在,前提是有不同的参数。)

在VS里,overloads很多时候都可以省略不写,不过在一些涉及继承方面的内容时,还是需要用到overloads的。在子类中我们希望添加一个重载方法,增强子类功能时候,亦即重载基类中地方法时,就需要用到Overloads.如下例子:

'基类PublicClassPersonprivatemNameasstringprivatemBirthdayasDatePublicPropertyName()asStringGetReturnmNameEndGetSet(Byvalvalueasstring)mName=valueEndSetEndPropertyPublicPropertyBirthday()asStringGetReturnmBirthdayEndGetSet(Byvalvalueasstring)mBirthday=valueEndSetEndPropertyEndClass'子类PublicClassEmployeeInhertsPersonPrivatemHireDateasDatePrivatemSalaryasDoublePrivatemNamesasNewGeneric.Dictionary(ofNameTypes,String)PublicPropertyName(byval1asNameTypes)asStringGetReturnmNames(type)EndGetSet(Byvalvalueasstring)ifmNames.ContainsKey(type)thenmNames.Item(type)=valueElsemNames.Add(type,value)endifEndSetEndPropertyEndClass'(如果这里省略了Overload关键字,Name方法的信实现代码就会遮蔽原来的实现代码)

Overridable,Overridesandshadow

在.NET中实现多态有两种方式,覆盖(overrides)和投影(shadow),而投影又分为ShadosbyName(就是我们一般用的shadows)和Shadowsby

signature(参数序列).

PublicClassTheBasePublicOverridableSuba()Debug.Writeline("TheBase")EndSubEndClassPublicClassTheInheritedInheritsTheBasePublicOverridesSuba()Debug.Writeline("TheInherited")EndSubEndClassPublicClassTheShadowedInheritsTheInheritedPublicShadowsSuba()Debug.Writeline("TheShadowed")EndSubEndClass'情况一:DimcAsTheBasec=NewTheBase()c.a()'输出TheBasec=NewTheInherited()c.a()'输出TheInheritedc=NewTheShadowed()c.a()'输出TheInherited'情况二:DimcAsTheInheritedc=NewTheBase()c.a()'错误!无效的转换。c=NewTheInherited()c.a()'输出TheInheritedc=NewTheShadowed()c.a()'输出TheInherited'情况三:DimcAsTheShadowedc=NewTheBase()c.a()'错误!无效的转换。c=NewTheInherited()c.a()'错误!无效的转换。c=NewTheShadowed()c.a()'输出TheShadowed

此例说明Overridable、Overrides、Shadows的用法。

Overridable的意思是:可以被重写的。默认情况下,似乎不能重写基类中方法的行为的,基类必须显式地使用Overridable关键字,指出允许重写地方法。

Overrides的意思是:重写原来的,一般用于子类重写父类的方法。如果没有Overrides关键字,当实现一个与基类中某一方法同名同参数地方法时,会得到一个编译错误。

在运行的例子中我们可以清晰地看到,无论变量c的定义是什么,VB.NET都会尽量寻找到最后被定义的那个成员。也就是说,如果被重写了,那么就找“从变量类型开始,到这个变量所指对象实际上的类为止,最后一次被重写(Overrides)的那个成员”。(当然,如果找不到,那么还会往变量类型的祖先那个方向上去找。)

简单点讲就是说,无论c怎么定以,如果他指向的是一个TheBase,他就找“到TheBase为止最后一次被重写的那个Suba()”。如果他指向的是一个TheInherited,就找“到TheInherited为止最后一次被重写的那个Suba()”,也就是TheInherited里面的那个。

对于TheShadowed来说,情况稍微复杂一点:

overrideoverloadhideobscureshadow概念区别

1。一个实例方法可以覆写(override)在其超类中可访问到的具有相同签名的所有实例方法,VM将基于实例的运行期类型来选择要调用的覆写方法

2。一个域、静态方法或成员类型可以分别隐藏(hide)在其超类中可访问到的具有相同名字(对方法而言就是相同的方法签名)的所有域、静态方法或成员类型。隐藏一个成员将阻止其被继承

3。在某个类中的方法可以重载(overload)另一个方法,只要它们具有相同的名字和不同的签名。由调用所指定的重载方法是在编译期选定的

4。遮掩(obscure)一个变量可以遮掩具有相同名字的一个类型(比如System的一个String类型和System.out中的System),只要它们都在同一个范围内:如果这个名字被用于变量与类型都被许可的范围,那么它将引用到变量上。相似地,一个变量或一个类型可以遮掩一个包。例子:publicclassObscure{staticStringSystem;//Obscurestypejava.lang.Systempublicstaticvoidmain(String[]args){//Nextlinewon'tcompile:SystemreferstostaticfieldSystem.out.println(“hello,obscureworld!”);}}

5。一个变量、方法或类型可以分别遮蔽(shadow)在一个闭合的文本范围内的具有相同名字的所有变量、方法或类型。如果一个实体被遮蔽了,那么你用它的简单名是无法引用到它的;根据实体的不同,有时你根本就无法引用到它

////////////////////////////////////////////////////////////现在举一个shadow的例子,注意哦,很重要

packagecom.yinbodotcc;publicclassPrivateClass{publicvoidsleep(Stringa){System.out.println(".."+a);}publicstaticvoidsleep2(Stringa){System.out.println(".."+a);}publicvoidcall(){newThread(){publicvoidrun(){//从Thread那里继承到匿名类中的sleep方法遮蔽(shadow)//了我们想要调用的sleep方法,所以直接sleep("hello")找不到匹配的,所以//不可以,会编译出错的。//这个时候需要用PrivateClass.this来修饰一下子//想法,如果取一个不同的名字,则就没有这个问题了。PrivateClass.this.sleep("3");sleep2("4");}}.start();newThread(newRunnable(){publicvoidrun(){//下面可以的原因是由于,Runnable接口里面没有定义sleep函数sleep("4");}}).start();}publicstaticvoidmain(String[]args){PrivateClassp=newPrivateClass();p.call();}}

(virtual申明虚方法的关键字,说明该方法可以被重写,sealed说明该类不可被继承,override重写基类的方法,abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。)

new

new关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换

基类版本。也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的

方法。

在不使用new修饰符的情况下隐藏成员是允许的,但会生成警告。使用new显式隐藏成员会取

消此警告,并记录代之以派生版本这一事实。

Virtual

Virtual关键字允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写非

虚方法,virtual关键字不可以与static、abstract、private、override一起使用。

Virtual关键字又是和override紧密不可分的,如果要实现Virtual方法就必须要使用override

或new关键字(new和override产生的机理不同)。

abstract

抽象类中的成员必须通过从抽象类派生的类来实现。抽象类不能实例化。

在签名后没有大括号({})。

sealed

密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。密封类不能被

继承。

当应用于方法或属性时,sealed修饰符必须始终与override一起使用。

Override

Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方

法具有相同的签名

(程序集的名字、版本、Culture不知道,公钥,这些用于GAC中申明一个唯一的程序集)

一个程序集通常包括4个自定义属性,用来惟一识别程序集,它们是文件名(无扩展名)、版本号、区域性标识和公钥标记,比如:

"Hello,version=1.0.0.0,culture=neutral,publicKeyToken=9ebd24cc40ff21fd"

其中publicKeyToken是公钥的64位散列值,可以唯一标识程序集,拥有公钥标记的程序集称为强名称程序集,强名称程序集可以防篡改;可以安装到GAC中,为多个程序集所共享;还可以实施版本策略(不同版本的强名称程序集被认为是不同的程序集)。而公钥标记为空的程序集只能存在于所引用的程序集的目录以及子目录中,也无法实施版本策略(引用它的程序集会忽略版本号)。

public可被内外访问

protected只能被内部和之类访问

private只能内部访问

internal只能在该程序集中被访问

反射,为测试方法加了Attribute

(将发生的异常对象抛出,另一个只是抛出异常,并没有抛出原异常对象)

(第一个构造函数调用了第二个构造函数,这个构造函数构造了一个c对象的实例。)

PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。

一种代码复杂度的衡量标准,中文名称叫做圈复杂度。在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。

控制流图是McCabe复杂度计算的基础,McCabe度量标准是将软件的流程图转化为有向图,然后以图论的知识和计算方法来衡量软件的质量。McCabe复杂度包括圈复杂度(Cyclomaticcomplexity)、基本复杂度、模块涉及复杂度、设计复杂度和集成复杂度等。控制流程图分析是一个静态的分析过程,它提供静态的度量标准技术,一般主要运用在白盒测试的方法中。

控制流图的一个重要性质是它的可规约性(reducibility)。如果程序中不存在从循环外跳到循环内的goto语句,那么这个程序对应的控制流图是可规约的(reducible),反之这个控制流图就是不可规约的(irreducible)。因此,模块符合结构化程序设计的准则是控制流图可规约的基础。

圈复杂度的计算方法很简单,计算公式为:V(G)=e-n+2。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量。其实,圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数,对应的计算公式为:V(G)=区域数=判定节点数+1。

对于多分支的CASE结构或IF-ELSEIF-ELSE结构,统计判定节点的个数时需要特别注意一点,要求必须统计全部实际的判定节点数,也即每个ELSEIF语句,以及每个CASE语句,都应该算为一个判定节点。判定节点在模块的控制流图中很容易被识别出来,所以,针对程序的控制流图计算圈复杂度V(G)时,最好还是采用第一个公式,也即V(G)=e-n+2;而针对模块的控制流图时,可以直接统计判定节点数,这样更为简单。

lock的使用publicvoidLockTest(){ObjectlockObj=newObject();lock(lockObj){//}}

FullTrust完全信任。

放入GAC中的Assembly是否FullTrust我的理解不是。

我理解FullTrust是可以通过代码设定的

可以更加灵活的设置对代码的访问权限,实现代码级保护。?这点不是特清楚,有明白的给讲解下

全局程序集缓存中如果有Corillian就更新该程序集,没有就安装

显示程序集foo.dll的公钥标记

我想OOP和SOA应该没有对比性吧。OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态。而SOA是一个技术框架,技术框架和编程模型应该说不是一码事吧?SOA的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了OOP的优点。

我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.

原因可能有两点:1)try..catch在出现异常的时候影响性能2)应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等

Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。

Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUGDebug.Write等,而Release则会将那些特殊标记省略

方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么

抽象类能有具体实现,而接口只定义行为规范,不能有具体实现。一个类只能继承一个父类,但能实现多个接口。

不一样。a.Equals(b)表示a与b一致,a==b表示a与b的值相等

对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同

实现IClonable接口

装箱(boxing)是将值类型的数据转化成引用类型,inti=3;objecto=i;便是装箱过程。

拆箱(unboxing)是将饮用类型数据转换值类型,比如intj=(int)o;属于拆箱。

引用类型

只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。

我挺喜欢用out参数的,特别是当函数需要有多于1个返回的时候,我比较愿意用out,

可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。对方法的参数设置Attribute的例子[AttributeUsage(AttributeTargets.Parameter)]publicclassParameterAtt:Attribute{publicintMin=100;}publicclassAttributeTest{publicvoidTestMethod([ParameterAtt(Min=100)]intpar1){ParameterInfopara=MethodInfo.GetCurrentMethod().GetParameters()[0];ParameterAttatt=ParameterAtt.GetCustomAttribute(para,typeof(ParameterAtt))asParameterAtt;if(att.Min>par1){thrownewException("要求para1最小为"+att.Min);}}}

浏览器端传递数据到服务器的时候,服务器检查时候有_Viewstate是否存在,如果存在,就会在

isPostBack中返回true。

IPostBackEventHandler接口则定义除了上面Post上来数据以外的控件“自定义”客户端事件。页面使用Page.GetPostBackEventReference等函数输出的脚本命令可以直接被asp.net调用此控件的RaisePostBackEvent方法。例如一个会计凭证控件具有此接口,如果你希望点击一个对象触发它的“记账”功能,就可以这样写代码:

Ctr.Attributes.Add("onclick",Page.GetPostBackEventReference(凭证,"记账"))

它运行时就会在Ctr中输出类似__doPostBack('ctr0_ctr_1','记账')的命令,并且点击此Ctr会触发会计凭证的记账事件。

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隐藏输入元素。

machineKey的作用在于下述场景:

·ASP.net使用formsauthentication时的cookie数据的加密和解密。以确保这部分数据不会被篡改。

·viewstate数据的加密和解密。以确保这部分数据不会被篡改。

·使用进程外session(out-of-processsession)时,对会话状态标识进行验证。

附件!!!!!!!!!!!!!!

WebGarden:IIS6WebGarden指的是一个应用程序可以成多个进程(w3wp.exe)来执行,一次请求使用其中的一个。用这个的主要目的是提高程序的可用性。当其中一个进程发生错误,那么也不会影响其他进程。发生错误的进程可以根据规则关闭,而其他的进程则可以继续工作。(引用别人滴,俺自己还没理顺怎么解释它。)

IIS6.0Web园(WebGarden)

IIS6.0允许将应用程序池配置成一个Web园(WebGarden)。要理解Web园的概念,可以设想这样一种情形:假设有一个IIS5.0服务器和三个Web网站,每一个Web网站运行着相同的应用程序,如果IIS5.0能够自动按照圆形循环的模式将请求依次发送给这些功能上等价、实际上分离的Web网站,将负载分离到三个不同的进程,就可以构成一个小型的Web农场(WebFarm)——这就是Web园。

Web园:在Web园中你可以配置此应用程序池所使用的最大工作进程数,默认为1,最大可以设置为4000000;配置使用多个工作进程可以提高该应用程序池处理请求的性能,但是在设置为使用多个工作进程之前,请考虑以下两点:

每一个工作进程都会消耗系统资源和CPU占用率;太多的工作进程会导致系统资源和CPU利用率的急剧消耗;

每一个工作进程都具有自己的状态数据,如果Web应用程序依赖于工作进程保存状态数据,那么可能不支持使用多个工作进程。

问:IIS6.0具有一个名为Web园的新功能,有了它,可以将应用程序池配置为使用多个工作进程。IIS何时创建额外的工作进程?在我们实施Web园之前,我们应该了解哪些知识?

答:在您创建应用程序池时,就会通知IIS6创建一个工作进程,以传送指派给该应用程序池的Web站点、文件和文件夹的内容。您可以将应用程序池配置为启动多个,而非一个工作进程,这样可以提高可扩展性。这个功能的名为Web园,是小型的“Web农场”。您无需使用多台计算机来传送相同的内容(Web农场),而是可以使用一台计算机中的多个进程来传送相同的内容。

在将IIS6应用程序配置为Web园时,您只需在“应用程序池属性”的“性能”选项卡的“最大工作进程数”框中,设置一个大于1的工作进程数。如果这个值大于1,每个请求都将启动一个新的工作进程实例,可启动的最多进程数为您所指定的最大工作进程数。后续的请求将以循环的方式发送至工作进程。

Web园在您的应用程序资源有限的情况下非常有用。例如,如果您到数据库的连接很慢,那么您可以使用多个工作进程来增加用户吞吐量,从而增加到数据库的连接数。

尽管在有些情况下使用Web园的用处非常大,但是要注意,每个工作进程的会话信息都是唯一的。由于请求以循环的方式路由到应用程序池工作进程,因此Web园对于会话信息存储在进程中的应用程序作用可能不大。在少数情况下,让多个工作进程运行同一个应用程序会造成资源竞争。例如,如果所有工作进程都试图将信息记录到日志文件中,或是使用那些不是专用于多个并发访问的资源,那么可能出现资源竞争问题。

如果不存在这些问题,那么Web园可能正是您所需的功能之一,而且其作用会非常大。

标记为ThreadStaticAttribute的静态(在VisualBasic中为Shared)字段不在线程之间共享。每个执行线程都有单独的字段实例,并且独立地设置及获取该字段的值。如果在不同的线程中访问该字段,则该字段将包含不同的值。

注意不要为标记为ThreadStaticAttribute的字段指定初始值,因为这样的初始化只会发生一次,因此在类构造函数执行时只会影响一个线程。在不指定初始值的情况下,如果它是值类型,可依赖初始化为其默认值的字段,如果它是引用类型,则可依赖初始化为空引用(VisualBasic中为Nothing)的字段。

classProgram

{

[ThreadStatic]staticinti;

staticRandomr=newRandom();

publicstaticvoidThreadProc()

i=r.Next(1,10);

while(true)

Console.WriteLine("{0}:{1}",Thread.CurrentThread.Name,i);

Thread.Sleep(500);

}

publicstaticvoidMain()

for(inti=0;i<2;i++)

Threadt=newThread(newThreadStart(ThreadProc));

t.Name="T"+i.ToString();

t.Start();

Console.WriteLine("PressEnterkeytoexit...");

Console.ReadLine();

学习附件!

学习附件再说

附件。

Get和Post的区别两点:

一、这两者传递参数时所用的编码不一定是一样的。在Tomcat中似乎Get的编码方式是根据页面中指定的编码方式,而Post则是一直使用同一种编码方式,可在Tomcat的server.xml中配置。

二、使用Get的时候,参数会显示在地址栏上,而Post不会。

所以,如果这些数据是中文数据而且是非敏感数据,那么使用get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用post为好。

表单提交中get和post方式的区别归纳如下几点:

1.get是从服务器上获取数据,post是向服务器传送数据。2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTMLHEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。4.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。5.get安全性非常低,post安全性较高。

1.HTTP请求格式:

[]

在HTTP请求中,第一行必须是一个请求行(requestline),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。

2.GET与POST区别

HTTP定义了与服务器交互的不同方法,最基本的方法是GET和POST.

(1)get是从服务器上获取数据,post是向服务器传送数据。

(1)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTMLHEADER内提交。

(2)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

(2)GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

(3)安全性问题。正如在(1)中提到,使用Get的时候,参数会显示在地址栏上,而Post不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用post为好。

下面举一个简单的例子来说明它们的区别:

<%IfRequest.QueryString("Text")<>""Then%>通过get方式传递的字符串是:"<%=Request.QueryString("Text")%>"
<%EndIf%>

<%IfRequest.Form("Text")<>""Then%>通过Post方式传递的字符串是:"<%=Request.Form("Text")%>"
<%EndIf%>

附件!!!

XML作为一门标记语言,它就需要一种文档(即文档类型定义DTD)来定义,DTD可以看作是一类XML文档的模板。它定义了文档的逻辑结构,规定了XML文档中所使用的元素,实体,元素的属性,元素与实体之间的关系。它使得数据交流与共享得以正常进行,验证了数据的有效性。DTD可以是一个完全独立的文件,也可以在XML文件中直接设定。所以,DTD分为外部DTD(在XML文件中调用另外已经编辑好的DTD)和内部DTD(在XML文件中直接设定DTD)两种。在一些有相互业务往来的公司,如果他们使用的电子文档是XML文档,那么我们就可以定用一个独立的DTD文档。每次交换和定义时都引用它来验证结构完整性和语法的合法性。

THE END
1.教综&公基打卡第15天2.教育对生产力的反作用——经济功能 (1)教育是劳动力再生产的基本途径;(2)教育是科学知识再生产的最有效形式;(3)教育是进行技术创新的一个重要手段;(4)教育是提高劳动者素质和生产率的重要因素。 公基-科技常识 考点聚焦二 生活中的科技 二、生活中的医学常识 https://mp.weixin.qq.com/s?__biz=MzIyNjU3NDEzMA==&mid=2247584368&idx=3&sn=accddc3ea95934c6e09a58594ebe3cfc&chksm=e9080cb2a1c928d7440b55c62f65c9d590b324ee347747d68a0c22c8415a002040ef15933ee6&scene=27
2.评论:公务员《判断推理》通关试题每日练(2024年11月30日‘‘低碳生活’’是指要减少导致气候变化的过量碳排放,就要相应优化和约束某些消费和生产活动,倡导较低(或更低)的温室气体(二氧化碳为主的)排放的生活方式。可以简单地理解为:“适度吃、住、行、用,不浪费、多运动。”根据上述定义,下列哪个行为不属于低碳生活?( )单项选择题A、建筑中使用中空玻璃B、轿车定期http://www.sdsgwy.com/article/comment-6839933.html
3.(曼昆经济学原理微观分册)二像经济学家一样思考2. 经济模型——通常是由图形和方程组成的模型。所有模型都是建立在一些假设之上的,都是为了加深对现实的理解而进行了简化。 (1)单变量的常见图形:饼形图、柱形图、时间序列图 (2)两个变量的图形:坐标系——包括x坐标、y坐标以及原点,此外将数据作为一种有序数对(ordered pair)放在括号中,并用图形上的一点表https://zhuanlan.zhihu.com/p/9268255493
4.不礼貌策略(精选十篇)男嘉宾 (03) 处提出话轮要求“你能不能让我把话说完”, (语气急躁甚至不耐烦) 对徐铭争抢话轮表达不满。男嘉宾想要继续未说完的话, 但徐铭在 (04) 再一次成功抢夺话轮, 并结合不礼貌策略中批评、挑战策略对男嘉宾进行新一轮的反驳和攻击。 例(3)https://www.360wenmi.com/f/cnkeysc184ht.html
5.自考大专00277行政管理学复习重点复习资料1、举出几种具体的行政环境类型? (1)宏观行政环境一般指对公共行政活动的影响范围最广、规模最大,并且层次最高,以直接或间接的方式制约和影响着公共行政的总体活动与方向。 (2)中观行政环境,是指行政系统的组织结构和运行情况,包括行政组织的结构是否合理,职权划分是否明确,沟通是否通畅,制度是否健全等等。 http://mdgs.mdgs-edu.com/fxzl/1966.html
6.操作系统复习资料(超全!)间接相互制约关系(进程—资源—进程)进程的互斥 直接相互制约关系(进程—进程)进程的同步 临界资源 虽然在多道程序系统中的诸进程可以共享各类资源,然而临界资源却是一次只能供一个进程使用,使用完后归还系统,才能给其他进程使用。 临界区 进程对临界资源必须互斥使用,为实现对临界资源的互斥访问,应保证诸进程互斥地进https://blog.csdn.net/qq_29473607/article/details/131194486
7.国际经济法网虽然英美法系上述国家在司法实践过程中就董事的义务是否延伸至公司债权人从而形成一项独立的义务方面有争议,甚至在一些国家还出现了反复变化的过程,但是绝大多数的实务见解还是否认了董事对公司债权人负有直接义务。这个现象带有三方面的意义,首先,为什么会出现董事要对公司债权人负有直接、独立的义务这种实务见解呢?这背后https://ielaw.uibe.edu.cn/fxlw/bjsfx1/bjsszzf/13848.htm
8.生物入侵者语文教学设计(通用8篇)从课后附录中选四个你认为用得好的词,揣摩其情味和作用。 生物入侵者语文教学设计 篇2 教学目标 1.理清文章思路,感知文章内容,提高阅读科普文的能力。 2.品味文章语言,了解本文说明方法,学习使用典型例子来说明的方法。 3.明白生态系统是一个相互依赖和制约的系统,要按照科学规律对待生态环境。 https://www.yuwenmi.com/jiaoan/banianji/814920.html
9.营销沟通技巧(集合15篇)因此,我国自古以来,对称呼就有十分严格和烦琐的规定,否则,不仅失礼、丢面子,还可能落下不敬之罪名。随着现代生活的演变,人际交往过程中的称呼已日趋简单化、实用化,烦琐的称呼已被逐渐淘汰,出现了许多新的称呼语。如何掌握恰当的称呼语,直接关系到一个人的文化修养,影响对方对你的认识和情感。https://m.jy135.com/zhichang/806788.html
10.守望中华礼仪之邦光明日报下面我们举一个例子。《周礼》里的秋官是主管司法的部门,但这绝不是一个滥用刑罚的机构,因为严刑酷法不能彻底解决问题。刑是一种在迫于无奈的时候才使用的教育手段,目的是为了最终不用刑。因此,秋官里面有许多合于“理”的规定。例如,在判定罪名时,先要确认是故意犯罪还是过失犯罪、是初犯还是屡犯?如果属于初犯,罪https://www.gmw.cn/01gmrb/2006-07/13/content_448759.htm
11.高考作文事例论证的技巧注意事项及展开10法如果在文章中选用一些新颖的事例,令人眼睛发亮,效果岂不更好? 要举出新颖的典型的事例,需要有丰富的知识储备和阅读积淀。这就要求大家平常要多读报刊时文,留心积累新鲜素材,这样写作时才能派得上用场。 三、事例宜真实忌虚假 议论文中所引用的事例,不论是历史上的还是现实生活中的,都必须真实,不能虚构,不能编造,https://www.360doc.cn/article/1353443_309345167.html
12.数学论文(精选13篇)在学习了米、厘米以及如何进行测量之后,让学生运用掌握的数学知识解决生活中的实际问题。如测量身高,测量手臂伸开的长度,测量一步的长度,测量教室门的宽度以及测量窗户的宽度,通过上述活动,加深学生对厘米和米的理解,巩固用刻度尺量物体长度的方法,同时,学生获得了日常生活中一些常识性数据。在这个活动中提高了学生的https://biyelunwen.yjbys.com/fanwen/shuxue/46320.html
13.教育心理学教育心理学是研究学校情景中学和教的基本规律的科学教育心理学的研究对象应不限于学校情景中学和教的基本规律,应扩展为各个年龄阶段、各个范围里学习和教学过程中交互作用的规律。包括学生、教师、教学内容、教学媒体和教学环境五种要素,和学习过程、教学过程和评价/反思过程这三种活动过程。 http://www.360doc.com/content/15/0809/19/27065013_490581415.shtml