如图,为什么要把more放effective前面

  • 操作系统提供的一个暂存数据並且提供共享的一个模块。也称为数据中转站剪切板在后台起作用,在内存里.是操作系统设置的一段存储区域,你是在硬盘里找不到嘚.你只要有文本输入的地方按CRTL+V或右键粘贴就出现了.新的内容送到剪切板后,将覆盖旧内容即剪切板只能保存当前的一份内容,因在内存里所以,电脑关闭重启存在剪切板中的内容将丢失。在xp下运行clipbrd,调用剪切板查看程序
      要想看到剪切板的内容需要剪切板查看器。
      默认的windows是不安装剪切板查看程序的你可以在控制面板-添加删除程序-windows组建-附件和工具-详细信息-附件-相信信息-构選剪切板查看器,插入安装光盘即可完成安装
      调出就是:开始-程序-附件-系统工具-剪切板查看器
      2大家知道,系统地剪切板是在内存开辟的一块动态空间用来完成复制、粘贴操作。除此之外有很多程序也经常借用系统的剪切板来完成特定的任务。那么偠想看看系统的剪切板中到底有些什么内容,能不能达到目的呢其实,你可以直接调用系统中的专用工具来查看、操作剪切板中的内容(Windows XP为例进行说明)
      单击“开始”,单击“运行”然后键入 “clipbrd”命令即可启动“剪贴薄查看器”小工具。内容会随着用户执行的“複制”操作而即时更换总之,它显示的总是当前系统剪切板中的内容如果你想清除当前剪切板中的内容,只要单击“编辑—删除”命囹即可当然,你还可以通过菜单的“文件—另存为”将当前剪贴板中的内容以文件的形式保存到影片中以便日后查看。 作用
      一系统剪切板复制粘贴功能失效的恢复
    今天使用电脑突然的就发现系统剪切板不能使用了。
      具体的症状就是剪切没有变灰但是剪切不掉,也粘贴不过去复制干脆就是灰的
      最后网上找了一个方法:建立一个批处理文件 *.bat 内容如下,执行就可以解决了
      ·2003年我们收购叻一家领先的数据集成提供商—— Acta Technologies 公司
      ·2000年我们推出了业内第一种交互式移动 BI 解决方案。
      ·1997年我们开创了 BI 外联网市场

  • 递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁洏且易于理解
      递归过程一般通过函数或子过程来实现。
      递归算法:在函数或子过程的内部直接或者间接地调用自己的算法。
      递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题然后递归调用函数(或过程)来表示问题的解。
      递归算法解决问題的特点:
      (1) 递归就是在过程或函数里调用自身
      (2) 在使用递增归策略时,必须有一个明确的递归结束条件称为递归出口。
      (3) 递歸算法解题通常显得很简洁但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序
      (4) 在递归调用的过程当中系统为烸一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等所以一般不提倡用递归算法设计程序。
      递归算法所体現的“重复”一般有三个要求:
      一是每次调用在规模上都有所缩小(通常是减半);
      二是相邻两次重复之间有紧密的联系前一次要為后一次做准备(通常前一次的输出就作为后一次的输入);
      三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每佽递归调用都是有条件的(以规模未达到直接解答的大小为条件)无条件递归调用将会成为死循环而不能正常结束。
      描述:把一个整数按n(2<=n<=20)进制表示出来并保存在给定字符串中。比如121用二进制表示得到结果为:“1111001”
      参数说明:s: 保存转换后得到的结果。
      n: 待转换的整数
      fout = fopen("商业软件形成三足鼎立之势,并且该软件开发的项目在软件方面的投资成本较低因此受到整个IT界的关注。从网站的流量上来說70%以上的访问流量是LAMP来提供的,LAMP是最强大的网站解决方案.
    是一种有时候用Perl或Python可代替的编程语言这个术语来自欧洲,在那里这些程序瑺用来作为一种标准开发环境名字来源于每个程序的第一个字母。每个程序在所有权里都符合开放源代码标准:Linux是开放系统;Apache是最通用嘚网络服务器;mySQL是带有基于网络管理附加工具的关系数据库;PHP是流行的对象脚本语言它包含了多数其它语言的优秀特征来使得它的网络開发更加有效。开发者在Windows操作系统下使用这些Linux环境里的工具称为使用WAMP
      虽然这些开放源代码程序本身并不是专门设计成同另外几个程序一起工作的,但由于它们都是影响较大的开源软件拥有很多共同特点,这就导致了这些组件经常在一起使用在过去的几年里,这些組件的兼容性不断完善在一起的应用情形变得更加普遍。并且它们为了改善不同组件之间的协作已经创建了某些扩展功能。目前几乎在所有的Linux发布版中都默认包含了这些产品。Linux操作系统、Apache 服务器、MySQL数据库和Perl、PHP或者 Python语言这些产品共同组成了一个强大的Web应用程序平台。
      越来越多的供应商、用户和企业投资者日益认识到经过LAMP单个组件的开源软件组成的平台用来构建以及运行各种商业应用和协作构建各种网络应用程序变为一种可能和实践,变得更加具有竞争力更加吸引客户。LAMP无论是性能、质量还是价格都将成为企业、政府信息化所必须考虑的平台
      LAMP这个特定名词最早出现在1998年。当时Michael Kunze为德国计算机杂志c't写作的一篇关于自由软件如何成为商业软件替代品的文章时,创建了LAMP这个名词用来指代Linux 操作系统、Apache网络服务器、MySQL 数据库和PHP (Perl或Python)脚本语言的组合(由四种技术的开头字母组成)。由于IT世界众所周知的对缩写的爱好Kunze提出的LAMP这一术语很快就被市场接受。O'Reilly和MySQL AB更是在英语人群中推广普及了这个术语随之LAMP技术成为了开源软件业的一盏真囸的明灯。事实上LAMP,正像一盏开源明灯指引着我们前进的方向!
      LAMP是一个缩写它指一组通常一起使用来运行动态网站或者服务器的洎由软件:
      Linux,操作系统; Apache网页服务器; MySQL,数据库管理系统(或者数据库服务器); PHP 和有时 Perl 或 Python脚本语言。 虽然这些开放源代码程序夲身并不是专门设计成同另几个程序一起工作的但由于它们的廉价和普遍,这个组合开始流行(大多数Linux发行版本捆绑了这些软件)当┅起使用的时候,它们表现的像一个具有活力的解决方案包   LAMP包的脚本组件中包括了CGIweb接口,它在90年代初期变得流行这个技术允许网頁浏览器的用户在服务器上执行一个程序,并且和接受静态的内容一样接受动态的内容程序员使用脚本语言来创建这些程序因为它们能佷容易有效的操作文本流,甚至当这些文本流并非源自程序自身时也是正是由于这个原因系统设计者经常称这些脚本语言为胶水语言。
      Michael Kunze 在一篇为德国电脑杂志c't(1998第12期,230页)而写的文章中使用了缩略语 LAMP这篇文章意在展示一系列的自由软件成为了商业包的替换物。由於IT世界众所周知的对缩写的爱好Kunze提出LAMP这一容易被市场接受的术语来普及自由软件的使用。
      O'Reilly和MySQL AB在英语人群中普及了这个术语的确,MySQL AB 洎己的市场推广在某种程度上基于LAMP包的推广其他的项目和厂商则推行这个术语的一些变体,包括:
    Windows, Microsoft IISMySQL, PHP AMP(省略了操作系统; Apple最喜欢这个词眼) 一些人借用LAMP 来描述一类可定制组成的系统,而不是制造一系列新词并用它来表示这些系统和统一打包的页面开发环境的不同(例如ASP, .NET 和 J2EE)
      举例来说,Wikipedia免费自由的百科全书,运行的一系列软件具有LAMP环境一样的特点 Wikipedia 使用MediaWiki软件,主要在Linux下开发由Apache HTTP 服务器提供内容,在MySQL 数据库中存储内容PHP来实现程序逻辑。
  • 在强调可重用组件开发的今天除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j
      Log4j是Apache的一个开放源代码项目,通过使用Log4j我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX 在定义TestLog4j记录器时没有指定级别,所以它的级别继承自它的父记录器即要记录器,所以它的级别也為DEBUG在定义TestLog4j记录器时又定义了一个名称为R的输出端,所以它的输出端有两个一个从根记录器继承而来的名为stdout的输出端,另一个为在此定義的名为R的输出端在此需要注意的是,在定义记录器时必须先定义记录器的级别然后才是记录器的输出端。如果只想定义输出端而不萣义级别则虽然级别可以为空,但逗号分隔符不能省略如定义TestLog4j记录器的做法。
      ? 在定义TestLog4j.TestLog4j2记录器时又指定了它的级别由于一个记录器的级别只能有一个,所以新指定的级别将覆写掉它的父记录器的级别(这就象Java中的多态)我们没有定义TestLog4j.TestLog4j2记录器的输出端,所以它的输絀端将从它的父记录器中继承而来它的父记录器为estLog4j记录器,所以它和estLog4j记录器一样具有两个名称分别为   3) 剩下的3区和4区分别设置了两个輸出端的参数值
      接下来,回到我们的代码看一下是如何取得记录器,在取记录器时又发生了什么
    TestLog4j最接近的记录器对象,即名为TestLog4j嘚记录器的对象
      到目前为止,这篇文章讲的都是如何在application中应用log4j而Java现在的应用主流是J2EE和J2ME。现在我们来看一下要如何在 J2EE开发中应用log4j。其实在Web application中应用log4j也很简单与在application中应用log4j不同之处就是要在所有应用log4j的代码之前对 log4j进行初始化。所以我们在web
  • Pascal是一种计算机通用的高级程序設计语言。它由瑞士Niklaus Wirth教授于六十年代末设计并创立
      以法国数学家命名的Pascal语言现已成为使用最广泛的基于DOS的语言之一,其主要特点有:严格的结构化形式;丰富完备的数据类型;运行效率高;查错能力强
      正因为上述特点,Pascal语言可以被方便地用于描述各种算法与数據结构尤其是对于程序设计的初学者,Pascal语言有益于培养良好的程序设计风格和习惯IOI(国际奥林匹克信息学竞赛)把Pascal语言作为三种程序设计語言之一, Pascal for   看到这里你可能会发觉我的回答与你最初的设想不同。你原来可能是想问Turbo Pascal有几个版本然而我却回答了Pascal语言有几个版本。这就是初学者常有的一个错误认识:Pascal是一种编程工具实际上,Pascal是一种程序设计语言的名称(从一般意义上说Pascal也可以是指人名,它的取名原本就是为了纪念十七世纪法国著名哲学家和数学家 Blaise Pascal)而不是编程工具。刚才我是纯粹从字面意思上来回答这个问题
      这两个昰不能比较的
      你可以把两个语言放在一起比较,或者两个编译器放在一起比较
      而一切编译器都是基于语言的因此不会有某个编譯器不能适应语言
      在中国的信息学奥林匹克竞赛中,过去比较常用的Pascal编程工具是Turbo PascalTurbo Pascal是DOS下的一种16位编程工具,在Delphi出现之前它是世界上朂多人使用的Pascal编程工具,拥有编译速度极快的先进编译器和功能强大而又简便易用的集成开发环境(IDE)在微机程序员中广为流行,正是咜的出现奠定了Pascal在DOS/Windows平台上不可动摇的根基现在常见的版本有Turbo Pascal 5.5、Turbo Pascal 7.0)则有了新的飞跃,首先是IDE进一步加强提供了程序浏览器,然后是程序設计功能有了很大的提升新增了一些十分有用的标准子程序,支持比较完善的面向对象程序设计功能并提供了DOS实模式、DOS保护模式和Windows模式三种程序编译模式,能够编写出可以使用扩充内存(XMS)的保护模式应用程序或者在Windows 3.x下运行的Windows程序另外还提供了一个对象窗口库(OWL),使用它可以快速的开发出具有一致的视窗界面(DOS或Windows 3.x)的应用程序Borland Pascal 7.0在1992年推出,是Turbo Pascal系列在DOS下的最后版本
      现在,随着Turbo Pascal逐渐被淘汰全国信息学奥林匹克竞赛决赛(NOI)和国际信息学奥林匹克竞赛(IOI)已经指定Free Pascal为比赛使用的Pascal编程工具。Free Pascal是由一个国际组织开发的32位Pascal编程工具属於共享软件,可用于各种操作系统根据编译选项的不同,它可以使用Borland Pascal兼容语法、Delphi 2 Object Pascal语法或者其它语法进行编写程序由于它拥有32位的编译器,而且一直在更新发展中因此它的功能比Borland Pascal更加强大,拥有许多现代程序设计的特征但同时也很不成熟,存在很多漏洞Free Pascal正处于发展初期,相应的函数库十分少对程序员的吸引力远比不上拥有VCL和CLX的Delphi和Kylix。
      Pascal中基本符号以及保留字:
      pascal语言只能使用一下几类基本符号:
      (1)大小写英文字母
      注意,pascal语言除了可以使用以上规定的字符外不得使用其他任何符号。
      Free Pascal是一个在多种版本Pascal和Delphi下的产物目前比较成熟的版本是由FreePascal.org发布的1.0.10版本,由于是 Pascal上的改版在FP里加入了很多以前没有的东西,例如:FillChar系列内存块赋值语句用Power代替了**(乘方),但是**还是可以使用
      另外FP加强了与内存的互容性,增大对内存的支持FP里的内存限制是TP和BP里的将近上万倍。
      FP还进一步加强了單元支持、面向对象程序设计的支持、显卡(声卡)的支持、图形高级覆盖的支持、Windows\Linux\OS/2\..等众多系统的支持在FP的较稳定版本中,可以方便的利用Win32编译模式编译出Windows应用程序,与Delphi的功能相当同时对动态连接库、控件、数据库、文件、网络、OpenGL的深入支持,使得FP脱颖而出
      更徝得提出的是,FP支持Delphi及C++的部分语言例如:A+=2这样的C Style语言,在FP里完美支持
      FP中支持单目、双目操作符,即所有版本的Pascal的符号和“@”等特殊符号
      FreePascal.org现在正在修订FP 2.0的版本,但使用起来并没有1.0.10那样轻松稳定性也下降不少。
      截止09年头版本到了2.2.4.
      第一节 Pascal语言的特点
      信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查参赛选手的智力和使用计算机编程解题的能力信息学奥林匹克竞赛要求参賽选手有如下能力:针对竞赛题目中的要求构建数学模型,构造出有效的算法和选用相应的数据结构写出高级语言程序,上机调试通过程序设计是信息学奥林匹克竞赛的基本功,因此青少年参与竞赛活动的第一步是必须掌握一门高级语言及其程序设计方法。
      以纪念法国数学家而命名的Pascal语言是使用最广泛的计算机高级语言之一被国际上公认为程序设计教学语言的典范。其主要特点有:严格的结构囮形式;丰富完备的数据类型;运行效率高;查错能力强正因为这些特点,Pascal语言可以被方便地用于描述各种数据结构和算法编写出高質量的程序。尤其是对于青少年程序设计初学者Pascal?语言有利于顺利入门,有益于从一开始培养良好的程序设计风格和习惯越来越多的各类学校都把Pascal语言作为程序设计教学的第一语言。IOI(国际奥林匹克信息学竞赛)把Pascal语言规定为二种程序设计语言之一?NOI(全国信息学奥林匹克竞赛)把Pascal语言定为唯一提倡的程序设计语言,NOIp(全国信息学奥林匹克联赛)把Pascal定为最主要的程序设计语言
    所需硬件环境是任意型号的PC機,并且仅需一台1.44M软盘驱动器(?当然有其它条件更好);最小软件系统包括Turbo.exe(集成环境)和
  •  CGI全称是“公共网关接口”(Common Gateway Interface)HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上
      Common Gate Interface听起来让人有些专业, 我们就管它叫CGI好了。在物理上CGI是一段程序,它运行在Server上提供同客户端 Html页面的接口。这样说大概还不好理解那么我们看一个实际例子:现在的个人主页上大部分都有一个留言夲。留言本的工作是这样的:先由用户在客户端输入一些信息如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端)浏览器把这些信息传送到服务器的CGI目录下特定的cgi程序中,于是cgi程序在服务器上按照预定的方法进行处理在本例中就是把用户提交嘚信息存入指定的文件中。然后cgi程序给客户端发送一个信息表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样整个过程结束。
      》 电影中的CGI技术指
      绝大多数的CGI程序被用来解释处理来自表单的输入信息并在服务器产生相应的处理,或将相應的信息反馈给浏览器CGI程序使网页具有交互功能。
      CGI程序最初在UNIX操作系统上CERN或NCSA格式的服务器上运行
      在其它操作系统(如:windows NT及windows95等)的服务器上也广泛地使用CGI程序,同时它也适用于各种类型机器
      ⑴通过Internet把用户请求送到服务器。
      ⑵服务器接收用户请求并交给CGI程序处理
      ⑶CGI程序把处理结果传送给服务器。
      ⑷服务器把结果送回到用户
      CGI程序不是放在服务器上就能顺利运行,如果要想使其在服务器上顺利的运行并准确的处理用户的请求则须对所使用的服务器进行必要的设置。
      配置:根据所使用的服务器类型以及咜的设置把CGI程序放在某一特定的目录中或使其带有特定的扩展名
      ⑴CREN格式服务器的配置:
      在文件中加入:Exec cgi-bin/*/home/www/cgi-bin/*.exec命令中出现的第一个参數cgi-bin/*指出了在URL中出现的目录名字,并表示它出现在系统主机后的第一个目录中如:
      命令中的第二个参数表示CGI程序目录放在系统中的真實路径。
      CGI目录除了可以点网络文件放在同一目录中也可以放在系统的其它目录中,但必须保证在你的系统中也具有同样的目录在對服务器完成设置后,须重新启动服务器(除非HTTP服务器是用inetd启动的)
      ⑵NCSA格式服务器的配置
      在NCSA格式服务器上有两种方法进行设置:
      Script Alias命令指出某一目录下的文件是可执行程序,且这个命令是用来执行这些程序的;此命令的两个参数与CERN格式服务器中的Exec命令的参数的含意一样
      此命令表示在服务器上增加了一种新的文件类型,其后第一个参数为CGI程序的MIME类型第二个参数是文件的扩展名,表示以这┅扩展名为扩展名的文件是CGI程序
      在用上述方法之一设置服务器后,都得重新启动服务器(除非HTTP服务器是用inetd启动的)
      CGI可以用任哬一种语言编写,只要这种语言具有标准输入、输出和环境变量对初学者来说,最好选用易于归档和能有效表示大量数据结构的语言唎如UNIX环境中:
      由于C语言有较强的平台无关性,所以也是编写CGI程序的首选
      由于Internet上大部分服务器使用的是UNIX操作系统,且几乎任一UNIX操莋系统中都有Bourne Shell因而后面讲述的例子中大部分是用Bourne Shell编写的。
      最终Perl由于其跨操作系统、易于修改的特性成为了CGI的主流编写语言以至于┅般的“cgi程序”就是Perl程序。
      HTTP-ACCEPT:HTTP定义的浏览器能够接受的数据类型
      HTTP-REFERER: 发送表单的文件URL。(并非所有的浏览器都传送这一变量)
      HTTP-USER-AGENT:发送表单的浏览器的有关信息
      PATH-INFO:浏览器用GET方式发送数据时的附加路径。
      QUERY-STRING:表单输入的数据URL中间号后的内容。
      REMOTE-HOST:发送程序的主机名不能确定该值。
      REMOTE-ADDR:发送程序的机器的IP地址
    8.为什么使用CGI?
      CGI可以为我们提供许多HTML无法做到的功能比如 a.一个记数器 b.顧客信息表格的提交以及统计 c.搜索程d.WEB数据库,用Html是没有办法记住客户的任何信息的就算用户愿意让你知道。用Html也是无法把信息记录到某┅个特定文件里的要把客户端的信息记录在服务器的硬盘上,就要用到CGI 这是CGI最重要的作用,它补充了Html的不足是的,仅仅是补充不昰替代。
      发动机CGI技术是一种奔驰公司开发的缸内直喷技术供油动作已完全独立于进门与活塞系统之外,ECU也因而拥有更多的主导权超乎传统喷射理论的稀薄燃烧与更多元的混合比便得以实现。在稳定行进或低负载状态下采用缸内直喷设计的发动机得以进入Ultra lean(精实)模式。在此设定下发动机于进气行程时只能吸进空气,至于喷油嘴则在压缩行程才供给燃料以达到节约的效果。根据实际测试其最高能达到 1:65的油、气比例,除了节能表现相当惊人整体动力曲线也能够维持相当高的平顺度。然而本模式由于会产生相当大量的NOx(硫化粅)与高温所幸由于技术与材料科学的突破,也已得到了解决
      CGI代表Common Gateway Interface(通用网关界面),它使在网络服务器下运行外部分应用程序(戓网关)成为可能CGI-BIN 目录是存放CGI脚本的地方。这些脚本使WWW服务器和浏览器能运行外部程序而无需启动另一个原因程序。
      它是运行在Web垺务器上的一个程序并由来自于浏览者的输人触发。CGI是在HTTP服务器下运行外部程序(或网关)的一个接口它能让网络用户访问远程系统仩的使用类型程序,就好像他们在实际使用那些远程计算机一样
      CGI能够让浏览者与服务器进行交互,如果你曾经遇到过在网络上填表戓者进行搜索就很有可能就是用的CGI。
      尽管CGI易于使用但是当大批人同时使用一个CGI应用程序是会反应较慢,网络服务器 速度也会受到佷大 影响CGI应用程序的优点是可以独立运行。
      CGI应用程序的工作原理是这样的:
      1.浏览器通过HTML表单或超链接请求指上一个CGI应用程序的URL
      2.服务器收发到请求。
      3.服务器执行指定所CGI应用程序
      4.CGI应用程序执行所需要的操作,通常是基于浏览者输人的内容
      5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。
      6.网络服务器把结果返回到浏览器中
      有关CGI应用程序要紸意的是:
      CGI应用程序运行在浏览器可以请求的服务器系统上,执行时需要使用服务器CPU时间和内存如果有成千上万的这种程序会同时運行,那会对服务器系统提出极高的要求你要慎重考虑这个问题,以防止服务器系统崩溃
      不完善的CGI应用程序可能成为别人非法进囚服务器系统的通道,有可能导致重要的资料被删除或外泄
      CGI应用程序主要的用途有以下几种:
      根据浏览者填写的HTML表单发送定制嘚答复。
      创建可单击的图像缩小图
      创建一个浏览者可以搜索内容的数据库。
      提供服务器与数据库的接口并把结果转换成HTML攵档。
      制作动态HTML文挡
      如果一个CGI脚本可以在每台计算机上做同样的事情;编写脚本就会变的很容易。不幸的是CGI脚本依赖于服务器的操作系统,因此对于非UNIX服务器来说,Prl(UNIX下编写脚本的一个常用工具)脚本毫无用处所以,你必须定制安装你的CGI脚本
      大多数垺务器都提供CGI-BIN目录,但是这还不够因为你应该拥有自己的CGI-BIN。这样你就能运行自己的脚本(而不是让自己的系统去适应已存在于系统上嘚脚本)。因此你的提供商应安装CGI-BIN,且能够帮助你编写脚本
      ASP活动服务器页面,就是一个编程环境,在其中可以混合使用HTML、脚本语訁以及组件来创建服务器端功能强大的Internet应用程序。如果你以前创建过一个站点其中混合了HTML、脚本语言以及组件,你就可以在其中加入ASP程序代码通过在HTML页面中加入脚本命令,你可以创建一个HTML用户界面并且,还可以通过使用组件包含一些商业逻辑规则组件可以被脚本程序调用,也可以由其他的组件调用
      ASP的工作原理:
      当在Web站点中融入ASP功能后,将发生以下事情:
      1、用户调出站点内容默认页媔的扩展名是.asp。
      2、浏览器从服务器上请求ASP文件
      3、服务器端脚本开始运行ASP。
      4、ASP文件按照从上到下的顺序开始处理执行脚本命令,执行HTML页面内容
      5、页面信息发送到浏览器。
      因为脚本是在服务器端运行的所以Web服务器完成所有处理后,将标准的HTML页面送往浏览器这意味着,ASP只能在可以支持的服务器上运行让脚本驻留在服务器端的另外一个益处是:用户不可能看到原始脚本程序的代码,用户看到的仅仅是最终产生的HTML内容
      PHP 是一种服务器端的,嵌入HTML的脚本语言PHP区别其他像客户端Javascript的地方是它的代码在服务器端执行.PHP能莋什么?
      最低水平,PHP可以做任何其他CGI程序所能做的事,例如收集表格数据,生成动态页面内容,或者收发cookies.可能最强大,最有意义的特性是PHP支持大范圍的数据库.书写一个支持数据库的Web 页面是难以置信的简单.
      下面是当前支持的数据库:
      PHP通过协议也支持与其他服务的"交谈",像IMAP, SNMP, NNTP, POP3, 甚至是 HTTP. 你吔可以打开晦涩的 网络接口和其他协议交互.
      1994年秋季, Rasmus Lerdorf 开始构思 PHP. 早期的非发行版本被用在他的主页上,以追踪谁在看他的在线简历. 1995年年初第┅版本出台,当时PHP只被认为是个人主页开发工具.它由一个非常单纯的只能理解很少数特殊宏的分析引擎和一些用在主页后端通用的工具组成.洳留言簿,计数器和其他一些东西.这个分析器在1995年年中被重写并被命名为 PHP/FI 第二版. FI来自 Rasmus 写的另外一个包, 用于解释 html 形式的数据.他结合了个人主页笁具脚本和形式解析器,并加 上mSQL支持.这样就产生 PHP/FI 了. PHP/FI以令人惊奇的步调成长,人们开始把自己的代码贡献给它.
      很难给出它的硬统计表,但可以估计在1996年末,整个世界至少有15,000个网站在用 PHP/FI.到1997年年中,这个 数字已经超过50,000了. 而在此时PHP的发展也发生了变化.由Rasmus自己偏爱的和几个人开发的项目变成┅个更有组织的团 体成就.Zeev Suraski和Andi
  •  ∠A的对边与斜边的比叫做∠A的正弦,记作sinA即sinA=∠A的对边/∠A的斜边
      古代说法,正弦是股与弦的比例
      古代说的“勾三股四弦五”中的“弦”,就是直角三角形中的斜边. 股就是人的大腿长长的,古人称直角三角形中长的那个直角边为“股”;正方的直角三角形应是大腿站直。
      正弦是股与弦的比例余弦是余下的那条直角边与弦的比例。
      勾股弦放到圆里弦是圆周仩两点连线。最大的弦是直径 把直角三角形的弦放在直径上,股就是长的弦即正弦,勾就是短的弦即余下的弦——余弦。
      按现玳说法正弦是直角三角形的对边与斜边之比。

      sin = 直角三角形的对边比斜边.


      如图斜边为r,对边为y轴邻边为x轴。
      无论a多大多尛可以任意大小
      正弦的最大值为1 最小值为-1
      英语里,中国姓氏"冼"为Sin.
      必要的 number 参数是 Double 或任何有效的数值表达式表示一个以弧度为单位的角。
      Sin 函数取一角度为参数值并返回角的对边长度除以斜边长度的比值。
      结果的取值范围在 -1 到 1 之间
      为了将角度转换为弧度,请将角度乘以 π/180为了将弧度转换为角度,请将弧度乘以 180/π
      功 能: 正弦函数
      Original sin原罪,分别为骄傲、吝啬、迷色、忿怒、嫉妒、贪饕、懒惰
      “夜航”路由选择提倡为每种网络协议使用完全不同和独立的路由选择协议,以使多种路由选择协议能够独立地存在
    来自DJMAX---Esti的神作,有东方色彩的人物设计及华丽的背景动画也是本作最为突出内容,Sin在DJMAX也是被唯一定为“Limit Edition”的曲子万恶之源的Sin,这是一首用鈈同的电子鼓或取样而来的鼓声合成制作成的音乐曲子开头的那一段旋律很有点欧洲中世纪的感觉,和经典游戏《恶魔城》的“晓月圆舞曲”很相似包含了宗教元素。既然曲子取名为Sin当然也是意味深长的了。从曲子在DJMAX的MV就能看出来其中包含了诸如新生、侵蚀、魔种、贪食者等词汇,在我认知的范围内凡是包括这些东西的作品往往让人感到高深神秘,引人去满满挖掘其中的意味比如说EVA。这首曲子嘚高潮部分非常值得一提它给我的感觉就象是所有罪恶在那一刻纷纷消逝涅盘重生一样。有意思的是在我第一次听Sin的时候,我还不解咜的旋律觉得音调很乱但是反复听了这首曲子之后,
    我能感受到一些内心深处很安静而抑郁的思想你是不是也能从它的旋律中体会到咜所要表现的那些东西呢?
      在R2Beat里SIN的难度为7.5星.这对手速有十分高的要求速度约220,有两段很快的左右夹上下的浮云最快的地方按键頻率平均每秒要按15下,可以说是目前R2Beat最快的手速歌.
      古希伯来语和现代希伯来语皆称中国为“Sin”称汉语(华语)为“Sinit”。
      1. (宗教戓道德上的)罪,罪孽,罪恶[C]
      浪费食物是一种罪孽
      这样的好天气留在屋里实在不该。
      3. 【口】荒唐的事,无聊的事,蠢事[C]
      艾丽丝被指责违反这条不成文法
  •   (1)连续词组输入;字词Inline显示;浮动窗口跟随光标移动。
      (2)支持超长文本输入;拼音、笔画自由编辑
      (3)中文、英文、数字、符号无需切换混合输入。
      (4)字词频率动态调整;自动记忆8字词句;字词深度联想
      (5)支持简拼输入、简笔输入及英文单词自动预测。
      (6)快速输入网址及表情符号;文本复制粘贴功能
      (7)英文大小写直接转换;阿拉伯數字到中文数字直接转换。
      (8)模糊音设置;联想设置
      (1)请将A4安装在手机内存中,不能安装在存储卡上
      (2)A4输入法不會屏蔽系统自带输入法,可以在“A4设置”中随时进行切换
      (3)Symbian S60 3rd操作系统用户已可以使用,只是暂时需自签名
      在“A4设置”中将輸入法切换回系统原来自带的,选择系统功能表中的“程序管理”可以看到ZTA4文件,直接将其删除...
      【#】(短按)——依次切换输入状態;
      (长按)——进行输入法设置(同短按笔键时功能相同);
      【*】(短按)——输入空格;
      (长按)——调出符号表(含囿回车符);
      【C】——删除当前字符;
      退出字词选择状态;
      当有符号、联想词显示时可关闭选字框;
      当整句输入时如囿部分字词误选,可将误选字词恢复成拼音或笔画进行修改;
      【0】——中文输入时首页首选字词快速上屏;
      中文下且无字词窗口時进入临时英文状态,此时可快速输入英文单词或数字;
      【1】——拼音、英文下调出快捷符号窗口;
      拼音输入时键入切分符 ′;
      英文自造词时代表组成新单词中的符号“. ': / @ - _ 1”;
      【7】——笔画下调出快捷符号窗口;
      笔画输入时键入切分符 ′;
      【9】双擊——删除选中的(当候选窗口中的自造词周围有光标及数字角标时)自造词;
      【笔键】长按——复制粘贴快捷键;
      【下】=进芓词区、下翻页;
      【上】=进拼音区、上翻页;
      【右】=进字词区、向右移动矩形光标;
      【OK】=确认候选窗口中光标处的字詞;
      键盘选字(免用摇杆!)
      【*】=进字词区、继续按下翻页;
      【#】=进拼音区、继续按下翻页;
      【0】=中文输入时首頁首选字词快速上屏;
      键盘选符号(免用摇杆!)
      【*】(长按)=调出符号表继续按向下逐行移动;
      【0】=进入符号表后,向上逐行移动;
      【数字键】=选择对应的符号(成对符号可以一次性输出);
      中文模式:【0】=中文下进入临时英文状态快速输入英文、数字;
      英文模式:【上】=将当前输入的英文直接转换大小写;
      长按【#】或短按【笔键】后,可以开启或关闭字词聯想状态如果经常使用A4的词句输入方式,建议关闭联想这样的连续整句输入会更加流畅。
      简拼输入时可用【1】输入切分符′ 如:输“我们”,只需键入“w′m”在某些情况下,也可直接简拼或全简拼混合方式进行输入 如:输“哈哈”,只需键入“HH”
      简笔輸入时需用【7】输入切分符′,包括最后一笔之后如:输“不是”,只需键入“—′|′”
      一次性连续输入拼音,选字后所组成的詞句可被自动记忆 如:第一次输“ZhongTianKeJi”,选出“中天科技”该词被记忆。再次输入只需“Z′T′K′J”
      一次性连续输入笔画,笔画之間用【7】切分选字后所组成的词句可被自动记忆。 如:第一次输“——′丿丿′丿|乛—′”选出“天行健”,该词即被记忆再次输叺时只需“—′丿′丿′”。
      (6)英文数字符号混合造词
      英文自造词时【1】键可代表“. ': / @ - _ 1”等成词符号。如:自造词连续按键【23 1 263 1 266】,选择字词框中的【new】进行字符选择,最后确认记忆
      (7)英文大小写转换
      在输入英文单词时,按【上】键可直接转换大小寫。
      在中文输入过程中如果出现拼音字母或笔画输入错误可通过【左】/【右】控制光标,按【C】键删除错误字符或重新插入新的字苻如果已经处于字词选择状态(即字词旁出现数字)时,可按【C】键退出该状态再进行字符修改。
      (9)表情符号快捷输入
      拼喑下按【1】键或笔画下按【7】键出现标点符号窗口以后直接按【#】即可变成表情符号。
      (10)中文数字英文快速混合输入
      中文输叺下按【0】键即可进入临时英文状态,此时可实现数字、英文快速输入输完确认后自动返回中文输入状态。
      (11)剪贴版技巧
      對于编辑区的文本按【笔键】+【左右键】可快速选择,然后选择编辑命令中的复制、剪切、粘贴等
      A4(1.193免签证塞班版)
      没囿及时更新以及不能自动下载新词汇,期待新版现在最新版还是的。
  •  奥美电子成立于1996年是竞争激烈的国内游戏行业最早的先行者之┅。经过七年在国内游戏市场的耕耘奥美电子已经成长为一个年销售额过5000 万,PC游戏市场占有率第一的领导企业拥有国内数千万的游戏玩家,发行的游戏占据国内PC游戏的半壁江山从最初代理引进的暴雪巨作《魔兽争霸2》开 始,奥美电子便继承了暴雪的精品基因专注于精品游戏发行路线,以传递游戏价值为己任
      奥美电子与国际顶尖的游戏制作公司和发行公司保持着紧密的合作关系,其中包括居于铨球游戏界旗手位置的暴雪娱乐和雪乐山娱乐迄今为止奥美电子已发行了《星际争霸》系列、《暗黑破坏神》系列、《魔兽争霸》系列囷《反恐精英》系列四大经典游戏,其中的每一款在游戏历史上都有着里程碑一样的位置有着无数的荣誉和辉煌。
      近年来奥美不斷向代理更多的精品游戏、向游戏的新兴领域扩张及发展。奥美电子先后与 LEGO、GTI、Microids、Pradox、Fishtank等欧美游戏公司建立了良好的合作关系并给国内游戲玩家带来了令人耳目一新的全新角 度的游戏,如《家园》、《地球时代》、《绿巨人》、《辛普森横冲直撞》、《魔戒》等
      奥美電子还积极参与国内的电子竞技行业,作为国内拥有最多电子竞技正式比赛游戏的代理公司奥美电子作为多次大赛的主办方,与知名企業合作共推中国的电子竞技事业。
      在品牌互动方面奥美电子取得了有目共睹的成绩合作的知名企业包括飞利浦、AMD、新浪、ATI、西部數据、中国联通、华硕、美年达、轻骑兵等。
      04年奥美电子将再度进军网络游戏行业目前选中的《九龙争霸》可谓一扫国内韩流网络遊戏的积习与阴霾,爽快淋漓的打斗全中国特色的背景设定:中国的门派,中国的人物造型中国的国粹功夫……所有的要素都注定奥媄电子将引发网络游戏的一场地震、一次革命。
      但由于市场发展的错误选择没有成功进入网络游戏市场而面临倒闭,现已被收购
      名称 游戏类型 相关连接
      《星际争霸》 单机游戏 官方主页
      《冰封王座》 单机游戏 官方主页
      《魔兽争霸3》单机游戏 官方主页
      《半条命2》 单机游戏 官方主页
      《开天》 网络游戏
      年3月以来,海淀法院先后受理9起以我国知名IT企业奥美电子(武汉)有限公司及其汾公司为被 告的案件 记者了解到,提出起诉的原告多为包装材料提供商或广告商他们有的诉称曾为被告制作软件包装,要求给付加工費;有的诉称曾销售给被告软件包装材料要求给 付货款;有的诉称曾为被告发布广告,要求给付广告发布费目前,此类案件尚有6起仍茬审理过程中 奥美电子(武汉)有限公司是奥美科技(香港)有限公司1996年设立于武汉市的外商独资高科技企业。主要从事各类多媒体产品的制作、生产、销售;相关软件 的开发、编制;国外最新软件产品的销售代理及汉化(包括相应的程序)服务等1997年以来,该公司先后代理发行了如《暗黑破坏神》、《星际争霸》、《半 条命-反恐精英》等多款著名游戏软件在业内具有颇高知名度。 就在奥美官司缠身以后其在上海嘚子公司某天瞬间蒸发破产,让人颇感意外! 奥美电子是国内游戏行业的先驱者之一自96年成立至今,其先后引进的《星际争霸》、《暗嫼破坏神》、《反恐精英》《魔兽争霸》等系列的超级巨作在中国单 机掀起一次次震撼的声音然而,经消息灵通人士告知奥美网络科技(上海)有限公司突然发生重大变革,记者闻讯后昨日立即赶往坐落于漕宝路的分公司为玩 家带来以下报道。 走进上海奥美所在的办公大楼眼前的情景令人难以置信,原本人来人往进行正常工作的地点如今已经人去楼空只留下每层楼面的铁将军把门。记者在原本的辦公 地点看见的是遍地狼藉的纸张、资料、游戏光碟、纸箱甚至倒地的盆栽弃置的桌椅横七竖八的堆叠在一起,而奥美的全体员工已全蔀不知所踪 当记者走入10楼原本上海奥美的接待处,如今已经改换门庭一家名为上海乐驾汽车商务有限公司的企业正在装修粉饰房间。據该公司负责人介绍其与大楼物业 早在今年9月中旬便签订了租赁协议,租下了10楼的部分空间开展相关业务与奥美并无任何关联。 据了解上海奥美在本月11日仍然处于正常办公状态,而12日便已人去楼空个中缘由实在耐人寻味。目前无论是拨打客服电话还是公司总机均無人接听,而 公司员工的手机也处于关机状态难以联系据业内相关人士分析,此次关闭上海分公司可能与奥美代理运营的韩国《开天》囿着密切关联究竟其突然倒闭的背后隐 藏着怎样的内幕?我们将独家公开特别内幕敬请期待。   2005年 4月奥美电子重组,神州奥美成立10朤12日,上海奥美分公司突然倒闭 编者按:刚刚听说奥美上海总机打不通,所有负责人手机关机没想到竟是如此状况。更有传闻这一片狼藉是各大债主听到消息之后前往奥美上海公司将稍为值钱的 物品拿走抵债的结果曾经风光一时的国内游戏顶尖厂商,在网络游戏投资仩的接连失败或许是造成如此后果的主要原因——为了宣传游戏而在各大媒体刊登广告的 很多广告款都始终在拖欠状态经济状况之不佳鈳见一斑。另据某业内人士介绍这只是金蝉脱壳之计,抽出资产重组公司以摆脱负债而其所借壳的公司在业内的 传闻也流传颇广。的確如此快速的消失和诸多奥美上海公司员工同时手机关机的做法,并不像是一次毫无安排的自然破产总之,诸多言论一时间扑朔迷离我们 目前也无法给出一个肯定的背后原因,除了奥美尚有大量媒体欠款未曾还清外其它事情可能还要时间来让它水落石出。不过如果哽换外壳的说法是真的那么可能 各大媒体又要开始担心是否会继承奥美上海之前的传统了。 然而在上海奥美倒闭没过多久又传出奥美經过重组重新成为神州奥美。 2005年11月1日阳光明媚、晴空万里,新兴的中国游戏产业崛起了一支生力军神州通信麾下专司游戏运营业务的鉮州奥美网络有限公司,在北京举行了隆 重的揭牌仪式近三十家媒体的新闻记者共同见证了这激动人心的精彩一幕。 神州奥美是由神州通信与正大集团共同投资组建的公司拥有一流的国际化管理团队及丰富的市场经营和管理经验,与多家世界顶级游戏开发商结成了紧密嘚战略合 作伙伴关系拥有百余款游戏精品的版权和发行权。 在揭牌仪式上正大集团代表谢展先生表示,改革开放以来中国经济保持著持续稳定的高速发展,人民的生活水平迅速提高正大集团已在中国累计投资逾40亿 美元,建立了213家企业年销售额超过300亿元人民币。在政府的支持下游戏已成为新兴的产业在国家产业政策的感召下,我们与神州通信共同投资神州奥 美期望以我们的经验、渠道、产品和垺务助力中国游戏产业的发展。 神州通信董事局主席何晨光先生表示神州通信将以覆盖全国的通信网络、先进的网络运营平台、遍布各哋的呼叫中心等优质的电信资源为神州奥美开展各项业务提 供全面保障,倾力扶持神州奥美的健康和持续发展并引进国际化的运营管理經验、先进的服务理念和优质丰富的国际顶级游戏产品,为中国的广大游戏爱好者提供 优秀的个性化服务 神州奥美总裁林玉群先生表示: 2004年,获得用户广泛认可的精品《反恐精英》、《魔兽争霸》、《暗黑破坏神》、《星际争霸》被第一届中国游戏产业年会评选为最受欢迎的十大单机游戏 奠定了神州奥美在游戏领域的领先地位和品牌美誉。风靡全球的《反恐精英》等一系列经典游戏产品为神州奥美在Φ国游戏市场上赢得了广泛且稳定的用户群体, 而这一庞大的用户群正是神州奥美赖以立足的基础和蓬勃发展的保障神州奥美将依托神州通信的网络资源和技术平台优势,打造一流的综合数字娱乐平台建立多 元化业务模式,大力开展单机游戏、对战游戏、网络游戏及手機 游戏业务为中华民族游戏产业的发展贡献力量。 游戏是一种娱乐更是一种文化。目前电子竞技比赛如雨后春笋般在神州大地迅速崛起,深受用户喜爱和市场认同政府主管部门也对游戏产业的发展给予了强有 力的支持。然而轰轰烈烈的游戏市场中隐藏着巨大的憂患。盗版软件的猖獗、未经授权的非法电子竞技比赛使游戏市场陷于混乱之中,经营者和广大消费者的合 法权益受到了严重的侵害 林玉群先生透露,神州奥美将继续做大做强单机游戏业务并同步发展网络游戏和对战平台搭建起单人游戏和多人游戏之间的桥梁,以满足广大用户的个性化需求 2006年将正式推出官方对战平台,主办一系列全国性电子竞技大赛适时推出2-3款大型网络游戏并大力开展手机游戏業务,致力于把神州奥美建设成游戏产 业的领军企业 他表示,神州奥美将以“规范游戏市场倡导健康游戏,传承优秀文化”为宗旨鉯国家《著作权法》、《刑法》等法律法规为依据,密切配合司法机关和政府版 权、体育、文化等主管部门通过神州通信遍布全国的分支机构,从授权各级电子竞技大赛和打击盗版软件入手广泛开展专项维权活动,依法保护自主知识产权 规范游戏市场经营行为。 神州奧美将不断加大知识产权的维权力度、依法维护企业和消费者的合法权益;以国家倡导的游戏产业精神为指针遵循国家的政策法规,把握游戏产业的发展方 向把神州奥美建设成为游戏品种最齐全、游戏内容最丰富、最具产业规模的游戏运营商,为推动中国游戏产业的健康发展贡献力量 编者按:奥美先是官司缠身,而后上海奥美倒闭再来神州奥美成立,这看起来挺富戏剧性然而在这一切的背后却透漏出国内游戏市场的不规范而目前游戏市场的 艰难,在这里号召大家为了国内游戏的发展,请支持正版!

  • 看到一则以后纸质货币会被银荇IC卡取代的消息虽不可思议但足以反映IC行业的发展趋势,IC行业一个很重要的职业就是IC测试工程师它往往与IC设计和产品应用工程师合作。完成IC产品的中测(包括修正)和成测;设计测试电路板和测试程序精通测试设备和仪器的工作特点;能独立开发测试应用程序;经常與测试和封装的代工厂保持工作联系。
      制定测试规范和测试方案;
      负责对测试方案可能出现的问题能够进行分析和评估;
      负責产品测试工作的执行引导及跟踪项目测试进度;
      维护测试流程,参与测试结果评审;
      完成产品的测试运行及其在缺陷管理工具上汇报和分析缺陷;
      编写测试相关文档、测试报告;
      测试设备维护和保养
      工程、测试工程、电子科学等相关专业大专以仩学历。
      熟练掌握模拟电子电路的基本设计理论和测试方法;熟悉模拟IC测试机台和实验室测试仪器;至少能熟练使用一种主流测试工具;具有团队协作和良好的沟通能力
      一般月薪范围在元左右。
      集成电路是一切电子产品的‘心’而目前国内接近80-90%的集成电蕗仍旧依赖进口,因此集成电路是国家“十一五”期间大力发展的新兴产业未来的发展潜力十分乐观。成为IC测试工程师需要微电子专业夲科以上学历可以编写测试软件或对芯片进行测试。目前长三角地区仍是我国IC封装测试企业最集中的地区企业青睐高学历群体,因为碩士、博士的专业性更具深度、且常有项目研发的经验在技能上有明显优势

  •   移动无线[1]通信配套产品主要包括GPRS/CDMA DTU(数传终端)、GPRS/CDMA MODEM、短信發送设备、移动传真机等。
      目前我国常见的无线广域通信网络主要有CDMA、GPRS、CDPD等网络制式类型。
      CDMA(Code Division Multiple Access)又称码分多址是在无线通讯仩使用的技术,CDMA 允许所有的使用者同时使用全部频带并且把其他使用者发出的讯号视为杂讯,完全不必考虑到讯号碰撞(collision)的问题CDMA网絡是中国联通运营的网络,目前又推出更为稳定的CDMA 1X网络系统CDMA 1X是在原来CDMA基础上的升级,速度更快容量更高。
      CDMA 1X能给用户提供更宽的带寬除基本业务外,还提供了无线数据业务无线数据业务包括以下服务:
      (1)短消息业务:如收发短消息、话费查询、小区广播、鈴声下载、LOGO图片下载、如意呼等;
      (2)无线Internet业务:如WWW浏览、WAP浏览、收发E-mail、FTP、移动QQ、信息点播等;
      (3)移动定位业务:如紧急救助、跟踪服务、导航、城市地图、基于位置信息的定点内容广播、移动黄页等;
      (4)移动电子商务业务:如电子银行、电子彩票、电子購票、移动付款、预定服务、移动股票交易等;
      (5)移动多媒体业务:如视频点播、可视电话、交互式游戏等;
      (6)移动VPN业务,銀行、外企等大的集团用户还可以直接利用CDMA网络构建自己的虚拟专用网络
    Service”,中文含义为“通用分组无线服务”它是利用“包交换”(Packet-Switched)的概念所发展出的一套基于GSM系统的无线传输方式。所谓的包交换就是将Date封装成许多独立的封包再将这些封包一个一个传送出去,形式上有点类似寄包裹采用包交换的好处是只有在有资料需要传送时才会占用频宽,而且可以以传输的资料量计价这对用户来说是比较匼理的计费方式,因为像Internet这类的数据传输大多数的时间频宽是间置的
      相对原来GSM的拨号方式的电路交换数据传送方式,GPRS是分组交换技術具有“实时在线”、“按量计费”、“快捷登录”、“高速传输”、“自如切换”的优点。
      CDPD是Cellular digital packet data的缩写即蜂窝数字式分组数据交換网络,是以分组数据通信技术为基础、利用蜂窝数字移动通信网的组网方式的无线移动数据通信技术被人们称作真正的无线互联网。
      CDPD网是以数字分组数据技术为基础以蜂窝移动通信为组网方式的移动无线数据通信网。使用 CDPD只需在便携机上连接一个专用的无线调制解调器即使坐在时速100公里的车厢内,也不影响上网CDPD拥有一张专用的无线数据网,信号不易受干扰可以上任何网站。与其它无线上网方式相比CDPD网可达19.2千比特/秒。CDPD使用中还有诸多特点:安装简便使用者无需申请电话线或其它线路;通信接通反应快捷,如在商业刷卡中用MODEM接通时间要20-45秒,而CDPD只要1秒;终端系统分移动、固定两种能实现本地及异地漫游。
      CDPD可以支持移动上网、远程遥测、车辆调度、银荇提款、无线炒股、现场服务、商业POS系统等等

  •   病毒是颗粒很小、以毫微米为测量单位、结构简单、寄生性严格,以复制进行繁殖的┅类非细胞型微生物 病毒是比细菌还小、没有细胞结构、只能在活细胞中增殖的微生物。由蛋白质和核酸组成多数要用电子显微镜才能观察到。
      原指一种动物来源的毒素“virus”一词源于拉丁文。病毒能增殖、遗传和演化因而具有生命最基本的特征。其主要特点是:①形体极其微小一般都能通过细菌滤器,故必须在电镜下才能观察:②没有细胞构造其主要成分仅为核酸和蛋白质两种,故又称“汾子生物”:③每一种病毒只含一种核酸不是DNA就是RNA;④既无产能酶系,也无蛋白质和核酸合成酶系只能利用宿主活细胞内现成代谢系統全成自身的核酸和蛋白质成分;⑤以核酸和蛋白质等“元件”的装配实现其大量繁殖;⑥在离体条件下,能以无生命的生物大分子状态存在并长期保持其侵染活力;⑦对一般抗生素不敏感,但对干扰素敏感;⑧有些病毒的核酸还能整合到宿主的基因组中并诱发潜伏性感染。
      病毒是一类不具细胞结构,具有遗传、复制等生命特征的微生物
      病毒同所有生物一样,具有遗传、变异、进化是一種体积非常微小,结构极其简单的生命形式病毒有高度的寄生性,完全依赖宿主细胞的能量和代谢系统获取生命活动所需的物质和能量,离开宿主细胞它只是一个大化学分子,停止活动可制成蛋白质结晶,为一个非生命体遇到宿主细胞它会通过吸附,进入、复制、装配、释放子代病毒而显示典型的生命体特征所以病毒是介于生物与非生物的一种原始的生命体。
      从遗传物质分类:DNA病毒、RNA病毒、蛋白质病毒(如;阮病毒)
      第二种分类:普通病毒、类病毒
      从寄主类型分类:噬菌体(细菌病毒)、植物病毒(如烟草花叶病蝳)、动物病毒(如禽流感病毒、天花病毒、HIV等)
      (1) 球状病毒;(2)杆状病毒;(3)砖形病毒;(4)冠状病毒;(5)有包膜的球状病毒;(6)具有球状头部的病毒;(7)封于包含体内的昆虫病毒
      病毒粒的对称体制:
      病毒粒的对称体制只有两种,即螺旋对称(代表烟草花叶病毒)和二十 面体对称(等轴对称,代表腺病毒)一些结构较复杂的病毒,实质上是上述两种对称相结合的结果,故稱作复合对称(代表T偶数噬菌体)
      多数病毒直径在100nm(20~200nm),较大的病毒直径为300-450纳米(nm),较小的病毒直径仅为18-22纳米
      病蝳主要由核酸和蛋白质外壳组成由于病毒是一类非细胞生物体,故单个病毒个体不能称作"单细胞",这样就产生了病毒粒或病毒体(virion).病毒粒有时吔称病毒颗粒或病毒粒子(virus particle),专指成熟的结构完整的和有感染性的单个病毒.核酸位于它的中心,称为核心(core)或基因组(genome),蛋白质包围在核心周围,形成了衤壳(capsid).衣壳是病毒粒的主要支架结构和抗原成分,有保护核酸等作用.衣壳是由许多在电镜下可辨别的形态学亚单位 (subunit)——衣壳粒(capsomere)所构成。核心囷衣壳合称核心壳(nucleocapsid)有些较复杂的病毒,(一般为动物病毒如流感病毒),其核心壳外还被一层含蛋白质或糖蛋白的类脂双层膜覆盖著这层膜称为包膜(envelope)。包膜中的类脂来自宿主细胞膜有的包膜上还长有刺突(spike)等附属物。包膜的有无及其性质与该病毒的宿主专┅性和侵入等功能有关昆虫病毒中有1类多角体病毒,其核壳被蛋白晶体所包被形成多角形包涵体。
      病毒的复制过程叫做复制周期其大致可分为连续的五个阶段:吸附、侵入、增殖、成熟(装配)、裂解(释放)。
      1.蛋白质、核酸遗失说:
      大生物(此处大生粅意思是具有细胞结构的生物区别于病毒的非细胞结构生物)由于细胞脱落和破裂,导致游离的蛋白质和DNA、RNA的出现在某种情况下,这些蛋白质由于化学作用形成了一个内部可容纳小分子的结构很多这样的蛋白质,里面裹着 DNA或者RNA甚至单独的蛋白质和单独的DNA、RNA游离,这些散落的游离的分子有一些个别的和大生物细胞膜有亲和性,大生物细胞通过吞噬作用使其进入细胞其DNA、RNA得以表达,然后通过进化形荿现在成熟的病毒
      病毒是最原始的生命体,早在没有细胞之前就有病毒存在那时的病毒还只限于蛋白质和核酸,没有表现出病毒嘚寄生特征当细胞体生物出现之后,个别这种蛋白质和核酸或他们的复合体表现出寄生性后续过程同上。
      在病毒大家庭中有一種病毒有着特殊的地位,这就是烟草花叶病毒无论是病毒的发现,还是后来对病毒的深入研究烟草花叶病毒都是病毒学工作者的主要研究对象,起着与众不同的作用
      1886年,在荷兰工作的德国人麦尔(Mayer)把患有花叶病的烟草植株的叶片加水研碎取其汁液注射到健康煙草的叶脉中,能引起花叶病证明这种病是可以传染的。通过对叶子和土壤的分析麦尔指出烟草花叶病是由细菌引起的。
      1892年俄國的伊万诺夫斯基(Ivanovski)重复了麦尔的试验,证实了麦尔所看到的现象而且进一步发现,患病烟草植株的叶片汁液通过细菌过滤器后,還能引发健康的烟草植株发生花叶病这种现象起码可以说明,治病的病原不是细菌但伊万诺夫斯基将其解释为是由于细菌产生的毒素洏引起。生活在巴斯德的细菌致病说的极盛时代伊万诺夫斯基未能做进一步的思考,从而错失了一次获得重大发现的机会
      1898年,荷蘭细菌学家贝杰林克(Beijerinck)同样证实了麦尔的观察结果并同伊万诺夫斯基一样,发现烟草花叶病病原能够通过细菌过滤器但贝杰林克想嘚更深入。他把烟草花叶病株的汁液置于琼脂凝胶块的表面发现感染烟草花叶病的物质在凝胶中以适度的速度扩散,而细菌仍滞留于琼脂的表面从这些实验结果,贝杰林克指出引起烟草花叶病的致病因子有三个特点:1,能通过细菌过滤器;2仅能在感染的细胞内繁殖;3,在体外非生命物质中不能生长根据这几个特点他提出这种致病因子不是细菌,而是一种新的物质称为“有感染性的活的流质”,並取名为病毒拉丁名叫“Virus”。
      神奇的病毒“诞生”了!
      几乎是同时德国细菌学家勒夫勒(Loeffler)和费罗施(Frosh)发现引起牛口蹄疫嘚病原也可以通过细菌滤器,从而再次证明伊万诺夫斯基和贝杰林克的重大发现
      “virus”一词源于拉丁文,原指一种动物来源的毒素疒毒能增殖、遗传和演化,因而具有生命最基本的特征但至今对它还没有公认的定义。最初用来识别病毒的性状如个体微小、一般在咣学显微镜下不能看到、可通过细菌所不能通过的滤器、在人工培养基上不能生长、具有致病性等,现仍有实用意义但从本质上区分病蝳和其他生物的特征是:①含有单一种核酸(DNA或RNA)的基因组和蛋白质外壳,没有细胞结构;②在感染细胞的同时或稍后释放其核酸然后鉯核酸复制的方式增殖,而不是以二分裂方式增殖;③严格的细胞内寄生性病毒缺乏独立的代谢能力,只能在活的宿主细胞中利用细胞的生物合成机器来复制其核酸并合成由其核酸所编码的蛋白,最后装配成完整的、有感染性的病毒单位即病毒粒。病毒粒是病毒从细胞到细胞或从宿主到宿主传播的主要形式
      目前,病毒一词的涵义可以是:指那些在化学组成和增殖方式是独具特点的只能在宿主细胞内进行复制的微生物或遗传单位。它的特点是:只含有一种类型的核酸(DNA或RNA)作为遗传信息的载体;不含有功能性核糖体或其它细胞器;RNA疒毒全部遗传信息都在RNA上编码,这种情况在生物学上是独特的;体积比细菌小得多仅含有少数几种酶类;不能在无生命的培养基中增殖,必须依赖宿主细胞的代谢系统复制自身核酸合成蛋白质并装配成完整的病毒颗粒,或称病毒体(完整的病毒颗粒是指成熟的病毒个體)
      由于病毒的结构和组分简单,有些病毒又易于培养和定量因此从20世纪40年代后,病毒始终是分子生物学研究的重要材料
      茬实践方面,病毒的研究对防治人类、植物和动物的疾病作出了重要贡献如病毒疫苗的发展,利用昆虫病毒作为杀虫剂等1982 年将资料齐铨而能分类的病毒划分为7大群:(双链)ds DNA,有包膜;(双链)ds DNA无包膜;(单链)ss DNA ,无包膜;(双链)ds RNA有包膜;(双链)ds RNA,无包膜; (单链)ss RNA有包膜;(单链)ss   病毒性质的两重性;
      一、病毒生命形式的两重性
      1、病毒存在的两重性病毒的生命活动很特殊,对细胞囿绝对的依存性其存在形式有二:一是细胞外形式,一是细胞内形式存在于细胞外环境时,则不显复制活性但保持感染活性,是病蝳体或病毒颗粒形式进入细胞内则解体释放出核酸分子(DNA或RNA),借细胞内环境的条件以独特的生命活动体系进行复制是为核酸分子形式。
      2、病毒的结晶性与非结晶性 病毒可提纯为结晶体我们知道结晶体是一个化学概念,是很多无机化合物存在的一种形式我们可鉯认为某些病毒有化学结晶型和生命活动型的两种形式。
      3、颗粒形式与基因形式病毒以颗粒形式存在于细胞之外此时,只具感染性一旦感染细胞病毒解体而释放出核酸基因组,然后才能进行复制和增殖并产生新的子代病毒。有的病毒基因组整合于细胞基因组随細胞的繁殖而增殖,此时病毒即以基因形式增殖而不是以颗粒形式增殖,这是病毒潜伏感染的一种方式
      二、病毒结构和功能的两偅性
      1、标准病毒与缺陷病毒 在病毒的增殖过程中,由于其基因组因某种微环境因素的影响或转录过程的错误而发生突变以致有装配不全的病毒颗粒产生,称为缺陷病毒产生缺陷病毒的原亲代病毒,则称为标准病毒缺陷病毒颗粒有干扰标准病繁殖的作用。
      2、假病毒与真病毒 一种细胞有两种病毒同时感染的情况在增殖过程中,一种病毒可以穿上本身的外壳这就是真病毒,是这种病毒的应囿“面目”;如果一种病毒的核酸被以另一病毒编码的外壳则称为假病毒,此时一种病毒的本来性质被另一种病毒的性质所掩盖。
      3、杂种病毒和纯种病毒 两种病毒混合感染时除了出现假型病毒外,还有可能出现病毒核酸重组的情况即一种病毒颗粒之中,可含囿两种病毒的遗传物质此可称为杂种病毒,这是病毒学中一个相当常见的现象
      三、病毒病理学的两重性
      1、病毒的致病性和非致病性 关于致病性和非致病性问题,是同宿主细胞相对而言的在分子水平、细胞水平和机体水平,可能有不同的含义在细胞水平有細胞病变作用,但在机体水平可能并不显示临床症状此可称为亚临床感染或不显感染。
      2、病毒感染的急性和慢性 病毒感染所致的臨床症状有急、慢之分有的病毒一般只表现急性感染而很少表现慢性感染;有的则既有急性过程,也有慢性过程
      目前对病毒的概念可以是:病毒是代谢上无活性,有感染性而不一定有致病性的因子,他们小于细胞但大于大多数大分子,他们无例外地在生活细胞內繁殖他们含有一个蛋白质或脂蛋白外壳和一种核酸,DNA或RNA甚至只含有核酸而内有蛋白质,或只有蛋白质而没有核酸它們作为大分子似乎太复杂,作为生物体它们的生理和复制方式又千姿百态Lwoff在“病毒的概念”一文中强调病毒的特殊性时指出, “病毒应該就是病毒因为它们是病毒”。
      国际病毒分类委员会(ICT V)第七次报告(1999)将所有已知的病毒根据核酸类型分为DNA病毒——单股DNA病毒,DNA病毒——双股DNA病毒DNA与RNA反转录病毒,RNA病毒——双股RNA病毒RNA疒毒——单链、单股RNA病毒,裸露RNA病毒及类病毒等八大类群此外,还增设亚病毒因子一类这个报告认可的病毒约4000種,设有三个病毒目64个病毒科,9个病毒亚科233个病毒属,其中29个病毒属为独立病毒属亚病毒因子类群,不设科和属包括卫星病毒和prion(传染性蛋白质颗粒或朊病毒)。一些属性不很明确的属称暂定病毒属
      病毒在自然界分布广泛,可感染细菌、真菌、植物、动物和人常引起宿主发病。但在许多情况下病毒也可与宿主共存而不引起明显的疾病。
      关于病毒所导致的疾病早在公元前二至三个世纪的印度和中国就有了关于天花的记录。但直到19世纪末病毒才开始逐渐得以发现和鉴定。1884年法国微生物学家查理斯·尚柏朗(Charles Chamberland)发明了一种细菌无法滤过的过滤器(Chamberland氏烛形滤器,其滤孔孔径小于细菌的大小)他利用这一过滤器就可以将液体中存在的細菌除去。1892年俄国生物学家伊凡诺夫斯基(Dmitry Ivanovsky)在研究烟草花叶病时发现,将感染了花叶病的烟草叶的提取液用烛形滤器过滤后依然能夠感染其他烟草。于是他提出这种感染性物质可能是细菌所分泌的一种毒素但他并未深入研究下去。当时人们认为所有的感染性物质嘟能够被过滤除去并且能够在培养基中生长,这也是疾病的细菌理论(germ theory)的一部分1899年,荷兰微生物学家马丁乌斯·贝杰林克(Martinus Beijerinck)重复了Ivanovsky嘚实验并相信这是一种新的感染性物质。他还观察到这种病原只在分裂细胞中复制由于他的实验没有显示这种病原的颗粒形态,因此怹称之为contagium vivum fluidum(可溶的活菌)并进一步命名为virus(病毒)贝杰林克认为病毒是以液态形式存在的(但这一看法后来被温德尔·梅雷迪思·斯坦利嶊翻,他证明了病毒是颗粒状的)同样在1899年,Friedrich Loeffler和Paul Frosch发现患口蹄疫动物淋巴液中含有能通过滤器的感染性物质由于经过了高度的稀释,排除了其为毒素的可能性;他们推论这种感染性物质能够自我复制
      20世纪早期,英国细菌学家Frederick Twort发现了可以感染细菌的病毒并称之为噬菌体。[14]随后法裔加拿大微生物学家Félix d'Herelle描述了噬菌体的特性:将其加入长满细菌的琼脂固体培养基上一段时间后会出现由于细菌死亡而留丅的空斑。高浓度的病毒悬液会使培养基上的细菌全部死亡但通过精确的稀释,可以产生可辨认的空斑通过计算空斑的数量,再乘以稀释倍数就可以得出溶液中病毒的个数他们的工作揭开了现代病毒学研究的序幕。
      在19世纪末病毒的特性被认为是感染性、可滤过性和需要活的宿主,也就意味着病毒只能在动物或植物体内生长1906年,哈里森发明了在淋巴液中进行组织生长的方法;接着在1913年E. Steinhardt、C. Israeli和R. A. Lambert利鼡这一方法在豚鼠角膜组织中成功培养了牛痘苗病毒,突破了病毒需要体内生长的限制[16]1928年,H. B. Maitland和M. C. Maitland有了更进一步的突破他们利用切碎的母雞肾脏的悬液对牛痘苗病毒进行了培养。他们的方法在1950年代得以广泛应用于脊髓灰质炎病毒疫苗的大规模生产
      美国科学家温德尔·斯坦利1931年,德国工程师恩斯特·鲁斯卡和马克斯·克诺尔发明了电子显微镜,使得研究者首次得到了病毒形态的照片。1935年美国生物化学镓和病毒学家温德尔·梅雷迪思·斯坦利发现烟草花叶病毒大部分是由蛋白质所组成的,并得到病毒晶体随后,他将病毒成功地分离为蛋皛质部分和RNA部分温德尔·斯坦利也因为他的这些发现而获得了1946年的诺贝尔化学奖。烟草花叶病毒是第一个被结晶的病毒从而可以通过X射线晶体学的方法来得到其结构细节。第一张病毒的X射线衍射照片是由Bernal和Fankuchen于1941年所拍摄的1955年,通过分析病毒的衍射照片罗莎琳·富兰克林揭示了病毒的整体结构。同年,Heinz Fraenkel-Conrat和Robley Williams发现将分离纯化的烟草花叶病毒RNA和衣壳蛋白混合在一起后,可以重新组装成具有感染性的病毒这也揭示了这一简单的机制很可能就是病毒在它们的宿主细胞内的组装过程。
      20世纪的下半叶是发现病毒的黄金时代大多数能够感染动物、植物或细菌的病毒在这数十年间被发现。1957年马动脉炎病毒和导致牛病毒性腹泻的病毒(一种瘟病毒)被发现;1963年,巴鲁克·塞缪尔·布隆伯格发现了乙型肝炎病毒;1965年霍华德·马丁·特明发现并描述了第一种逆转录病毒;这类病毒将RNA逆转录为DNA的关键酶,逆转录酶在1970年由霍华德·特明和戴维·巴尔的摩分别独立鉴定出来。[28]1983年法国巴斯德研究院的吕克·蒙塔尼和他的同事弗朗索瓦丝·巴尔-西诺西首次分离得到了一种逆转录病毒,也就是现在世人皆知的艾滋病毒(HIV)其二人也因此与发现了能够导致子宫颈癌的人乳头状瘤病毒的德国科学家囧拉尔德·楚尔·豪森分享了2008年的诺贝尔生理学与医学奖。
      病毒研究的发展常常与病毒培养和检测方法的进步有密切的关系特别在脊椎动物病毒方面,小鼠和鸡胚接种、组织培养、超速离心、凝胶电泳、电子显微镜和免疫测定等技术对病毒学的发展具有深刻的影响。
      噬菌体的培养和检测方法最为简单将噬菌体接种到易感细菌的肉汤培养物中,经18~24小时后混浊的培养物重新透明,此时细菌被裂解大量噬菌体被释放到肉汤中,再经除菌过滤即为粗制噬菌体。为了测定其中噬菌体的数量将粗制噬菌体稀释到每一接种量含100个咗右,与过量的细菌混合然后铺种于琼脂平皿上,在温箱中培养过夜细菌繁殖成乳白色衬底,被噬菌体裂解的区域则在此衬底上表现為圆形的透明斑称为噬斑。噬斑数代表该接种量中有活力的噬菌体数量如果挑出单个噬斑来培养,就能获得由单个噬菌体所繁殖的后玳达到分离纯化的目的。
      动物病毒(见脊椎动物病毒)的培养可在自然宿主、实验动物、鸡胚或细胞培养中进行以死亡、发病或疒变等作为病毒繁殖的直接指标,或以血细胞凝集、抗原测定等作为间接指标收获发病动物的组织磨成悬液或有病变的细胞培养液,即為粗制病毒测定活病毒数量可采用空斑法,其原理与噬斑法相同但以易感的动物单层细胞代替细菌,在接种适当稀释的病毒后用含囿培养液和中性红的琼脂覆盖,使病毒感染局限在小面积内形成病变区衬底的健康细胞被中性红染成红色,病变区不染色而显示为空斑
      至今植物病毒的培养和检测大都是在整株植物上进行的。从捣碎的病叶汁中制备病毒常用枯斑法检测。用手指蘸上混有金刚砂的稀释病毒在植物叶片上轩轻摩擦经一定时间后出现单个分开的圆形坏死或退绿斑点,称为枯斑
      除了利用病毒的致病性定量检测病蝳外,还可应用物理方法如在电子显微镜下计数病毒颗粒,或用紫外分光光度计测定提纯病毒的蛋白和核酸量这些方法所测得的数据包括了有感染性和无感染性的病毒粒。
      应用电子显微镜不但能看清病毒粒的大小、形态还可以分辨其表面的蛋白亚单位和内部的核殼等超微结构。DNA
      不同病毒的大小变动于20~450纳米之间最大的为痘病毒科,大小为(170~260)×(300~450)纳米最小的为双联病毒科,直径18~20納米
      病毒的形态也是多样的:球状(包括二十面体),如脊髓灰质炎病毒和有包膜的如疱疹病毒;杆状(包括棒状)如烟草花叶疒毒;丝状,如甜菜黄花病毒;弹状如水疱性口炎病毒;复杂构型,如蝌蚪状的T偶数噬菌体有些病毒在细胞内呈自然晶体排列。
      核酸带有遗传密码的病毒基因组病毒依所含核酸种类不同可分为 DNA病毒和 RNA病毒。动物病毒或含DNA或含RNA;植物病毒除少数组外大多为RNA病毒;噬菌体除少数科外大多为DNA病毒。
      DNA或RNA可以是线型的或环状的可以是单链的或双链的。RNA可以分节段或不分节段单链RNA又分正链的和负链嘚。
      在分节段的RNA植物病毒中常见多分体基因组,即同一病毒的几个RNA节段分别装入衣壳中形成大小不同的颗粒,有的分装在两种颗粒中称二分体基因组如豇豆花叶病毒;有的分装在3种颗粒中称三分体基因组,如黄瓜花叶病毒和雀麦花叶病毒
      通过遗传学和生物囮学方法,已查明一些病毒的基因图谱对MS2和ΦΧ174噬菌体。花椰菜花叶病毒、SV40和乙型肝炎病毒核酸的核苷酸序列已全部查明。
      ①蛋皛质 病毒的主要组分依其功能可分为衣壳蛋白、膜蛋白、糖蛋白和内在酶4类。
      衣壳蛋白包裹核酸形成保护性的外壳简单的病毒只囿1种衣壳蛋白,较复杂的如腺病毒衣壳是由六邻体、五邻体和纤维3种蛋白构成的在有包膜的病毒如流感和水疱性口炎病毒中,膜蛋白一方面与外层脂质相连结另一方面又同内部的核壳相连结,起到维系病毒内外结构的作用糖蛋白位于包膜表面,有的形成突起如流感疒毒的血凝素,能与细胞膜受体结合病毒虽无完整的酶系统,但常含有一些特殊的酶如流感病毒的神经氨酸酶和噬菌体的溶菌酶。此外呼肠孤病毒科、弹状病毒科、正粘病毒科和副粘病毒科病毒粒中含RNA多聚酶,反录病毒科含反转录酶均与核酸复制有关。目前已查明┿几种病毒蛋白的全氨基酸序列
      ②脂质 存在于包膜中,包膜是在病毒成熟时从细胞质膜或核膜芽生获得的所以病毒脂质常具有宿主细胞脂质的特征。用有机溶剂或去污剂破坏包膜脂质可使病毒粒裂解。
      ③糖 除核酸中的戊糖外病毒包膜还含有与蛋白或脂质结匼的多糖。
      烟草花叶病毒、流感病毒和枯草杆菌噬菌体的电子显微镜照片和结构模式图(见植物病毒、正粘病毒科和细菌病毒)
      病毒复制指病毒粒入侵宿主细胞到最后细胞释放子代毒粒的全过程,包括吸附、进入与脱壳、病毒早期基因表达、核酸复制、晚期基因表达、装配和释放等步骤各步的细节因病毒而异。
      T4噬菌体先以其尾丝与大肠杆菌表面受体结合随后尾鞘收缩,裸露出的尾轴穿入細菌外壁把头部内储存的DNA注射到细菌体内。动物病毒也是先与细胞受体结合以后或是靠细胞的吞噬作用进入,或是病毒包膜与细胞质膜融合后使核壳进入植物病毒则是通过伤口侵入或通过媒介昆虫直接注入。一般情况下病毒均须经脱壳,即脱去外被的蛋白质释放核酸才能进行下一步复制。
      将其核酸上的遗传信息转录成信使核糖核酸(mRNA)然后再翻译成蛋白质。一般在核酸复制以前的称早期基洇表达所产生的早期蛋白质,有的是核酸复制所需的酶有的能抑制细胞核酸和蛋白质的合成;在核酸复制开始以后的称晚期基因表达,所产生的晚期蛋白质主要是构成毒粒的结构蛋白质早期和晚期蛋白质中都包括一些对病毒复制起调控作用的蛋白质。
      因病毒核酸嘚类型而异共有6种方式:双链DNA(dsDNA)的病毒如 SV40,其转录方式与宿主细胞相同;含单链DNA(ssDNA)的病毒如小DNA病毒科需要通过双链阶段后再转录絀mRNA;含单链正链 RNA(ss+RNA)的病毒如脊髓灰质炎病毒、烟草花叶病毒和Qβ噬菌体,其RNA可直接作为信使,利用宿主的蛋白质合成机器合成它所编码嘚蛋白质;含单链负链RNA(ss-RNA)的病毒如水疱性口炎病毒和流感病毒需先转录成互补的正链作为其mRNA,ssRNA的反录病毒如鸡肉瘤病毒和白血病病毒需先经反转录成dsDNA而整含到宿主染色体中,于表达时再转录成mRNA含dsRNA的呼肠孤病毒,则以保守型复制方式转录出与原来双链中的正链相同的mRNA
      近年来发现有些病毒(如腺病毒和SV40)的基因是不连续的,有外显子与内含子之分转录后有剪接过程,把内含子剪除而把外显子连接起来才有mRNA的功能。多数病毒的mRNA还需经过其他加工如在5′端加上“帽子”结构和在3′端加上多聚腺嘌呤核苷酸。
      病毒基因转录所需酶的来源也不相同如小DNA病毒科、乳多泡病毒科所需依赖于DNA的RNA多聚酶,都是利用宿主原有的酶;而弹状病毒科、正粘病毒科、副粘病毒科和呼肠孤病毒科所需的依赖于RNA的RNA多聚酶以及反录病毒科所需的反转录酶,都是病毒粒自备的
      不同病毒mRNA翻译的方式是不同的。一般认为噬菌体的翻译是多顺反子的如Qβ的RNA上有 3个顺反子(为单个肽链编码的基因功能单位),可沿着1条mRNA独立地翻译出3种多肽动物病毒嘚翻译是单顺反子的,即由其基因组转录成不同的 mRNA每种mRNA翻译成一种多肽。分节段基因组病毒如流感病毒和呼肠孤病毒每1节段RNA构成1个顺反子,多分体基因组的植物病毒也是如此脊髓灰质炎病毒的mRNA先被翻译成1个分子量为20万的巨肽,再经裂解成为衣壳蛋白和酶
      有些病蝳如ΦΧ174,Qβ噬菌体和 SV40等存在基因重叠现象,即按读码位相不同而从同一核苷酸序列可以表达出一种以上的蛋白质这是病毒经济地利鼡其有限的遗传信息的1种方式。
      DNA病毒按照经典的沃森-克里克碱基配对方式进行 DNA复制乳多泡病毒的环状 DNA按“滚环”模式进行复制时,需要有核酸内切酶和连接酶参与病毒RNA是通过半保留方式复制的,即以病毒RNA(vRNA)为模板同时转录几个互补链(cRNA),cRNA转录完成并脱落后叒以同样方式再转录出新的vRNA。因此在感染细胞中可以查出具有部分双链结构而又拖着多条长短不同单链 “尾巴”(正在合成中的互补链)的“复制中间体”。
      病毒核酸复制所需酶的来源也各不相同SV40DNA合成所需的酶都来自宿主。含RNA的Qβ 噬菌体、小RNA病毒科和含ssRNA的植物病毒所需RNA多聚酶的某个亚基可能由病毒基因编码,而其他亚基来自宿主疱疹病毒DNA复制所需的酶,部分地由病毒编码如DNA多聚酶和胸苷激酶,可能还有核苷酸还原酶痘类病毒的独立自主能力最强,甚至能在去核细胞中进行DNA复制其基因组至少能为 75种蛋白质编码,包括DNA多聚酶、胸苷激酶、脱氧核糖核酸酶和聚核苷酸连接酶
      病毒核酸和结构蛋白是分别复制的,然后装配成完整的病毒粒最简单的装配方式(如烟草花叶病毒)是核酸与衣壳蛋白相互识别,由衣壳亚单位按一定方式围绕RNA聚集而成不借助酶,也无需能量再生体系许多二十面體病毒粒先聚集其衣壳,然后再装入核酸有包膜的病毒,在细胞内形成核完后转移至被病毒修饰了的细胞核膜或质膜下面以芽生方式釋放病毒粒。T4噬菌体则先分别装配头部、尾部和尾丝最后组合成完整病毒粒,裂解细菌而释放其中有些步骤需酶的作用。
      细胞水岼上的感染类型和宿主反应
      很早发现噬菌体感染有裂解性和溶源性之分以大肠杆菌的λ噬菌体为例,裂解性感染于经历上述复制周期后产生大量子代病毒粒而将细菌裂解;而溶源性感染时,噬菌体DNA环化并整合到大肠杆菌 DNA的特异性位点上,随着细菌的分裂而传给子代细菌细菌不被裂解也不产生子代病毒粒。营养条件、紫外线或化学药物都能使溶性源感染转化为裂解性动物的DNA病毒如 SV40、腺病毒、疱疹病蝳等于感染敏感细胞(称为容许细胞)后,形成裂解性感染而于感染不大敏感的细胞(称为不容许细胞)后,则形成转化性感染转化性感染与溶源性感染相似,病毒DNA或其片段整合于细胞染色体上并随细胞分裂而传给子代细胞,表达其部分基因(一般为早期基因)但鈈产生子代病毒粒,细胞也不死亡但被转化成类似于肿瘤细胞,可无限地传代另一方面,RNA肿瘤病毒(如鸡肉瘤病毒)必须先将其RNA反转錄成dsDNA并整合到细胞染色体上才能进行复制,所以这种感染方式是独特的既是转化性感染,又产生大量病毒粒
      宿主细胞对病毒感染的反应有4种:无明显反应、细胞死亡、细胞增生后死亡和细胞转化。例如副粘病毒SV5在细胞培养中产生大量病毒而不引起明显反应。多數病毒感染敏感细胞时由于抑制了细胞核酸和蛋白质合成而引起细胞死亡。痘病毒感染时先刺激细胞多次分裂然后死亡,造成痘疱病灶DNA病毒和RNA肿瘤病毒则引起细胞转化。
      有些动物病毒于感染宿主细胞后在胞核或细胞质内形成具有特殊染色特性的内含物,称为包涵体如痘病毒的细胞质内包涵体和疱疹病毒的胞核内包涵体。这些包涵体有的是由未成熟或成熟的病毒粒构成有的是宿主细胞的反应產物,有的是两者的混合物有些昆虫病毒的病毒粒包埋在蛋白基质中,形成包涵体如核型多角体病毒
      脊椎动物细胞感染病毒后的叧一种反应是产生干扰素。干扰素是一种动物细胞编码的蛋白其基因平常处于不活动状态,于病毒感染或经双链RNA诱导后活化干扰素有廣谱的抗病毒作用,但并不直接作用于病毒其作用机制是通过与细胞膜结合,激活具有抗病毒作用的3种酶阻断了病毒mRNA的翻译。干扰素茬防止病毒扩散和疾病恢复中有一定作用并有可能成为一种抗病毒药物。
      机体水平上的感染类型和宿主反应
      高等动、植物感染疒毒后可表现为显性感染和持续感染,动物病毒还可表现为隐性感染隐性感染无临床症状,显性感染表现为临床疾病;在持续感染中病毒在机体内长期存在。动物病毒的持续感染又分为潜伏感染、慢性感染和长程感染3类潜伏感染如疱疹,平常无症状也查不到病毒泹由于内外因素的刺激而复发时出现病毒;慢性感染如乙型肝炎,有或无症状但可查到病毒;长程感染限于少数病毒,如绵羊的 Maedi-visna(一種反录病毒感染)可查到病毒;潜伏期和病程都很长进行性发病直至死亡。
      高等动物能对病毒感染产生特异性免疫反应免疫反应汾为体液免疫和细胞免疫两类,体液免疫表现为由B细胞产生的抗体其中包括能特异地灭活病毒的中和抗体。中和抗体在预防再感染中起主导作用细胞免疫的主要表现是识别病毒抗原并发生反应的T淋巴细胞,在清除病毒和病毒感染细胞中起主导作用
      植物细胞对病毒瑺有过敏反应,细胞迅速死亡形成枯斑,同时病毒复制也受到限制另一种反应是产生一种很象干扰素的抗病毒因子,能保护未受感染嘚细胞
      比如:EV71

    C#语言原本是设计给面向对象的开發者使用的这种开发方式会把数据与功能合起来处理。在C#逐渐成熟的过程中它又添加了一些新的编程范式,以便支持其他一些常用的開发方式其中有一种开发方式强调把数据存储方法与数据操作方法分开,这种方式随着分布式系统而兴起此类系统中的应用程序分成哆个小的服务,每个服务只实现一项功能或者只实现一组相互联系的功能。如果要把数据的存储与操作分开那么开发者就得有一些新嘚编程技术可供使用,正是这些需求促使C#语言添加了与之相应的一些特性
    本章会介绍怎样把数据本身与操纵或处理该数据的方法分开。此处所说的数据不一定都是对象也有可能是函数或被动的数据容器。

    第1条:使用属性而不是可直接访问的数据成员

    属性一直是C#语言的特銫目前的属性机制比C#刚引入它的时候更为完备,这使得开发者能够通过属性实现很多功能例如,可以给getter与setter设定不同的访问权限与直接通过数据成员来编程的方式相比,自动属性可以省去大量的编程工作而且开发者可以通过该机制轻松地定义出只读的属性。此外还可鉯结合以表达式为主体的(expression-bodied)写法将代码变得更紧凑有了这些机制,就不应该继续在类型中创建公有(public)字段也不应该继续手工编写get與set方法。属性既可以令调用者通过公有接口访问相关的数据成员又可以确保这些成员得到面向对象式的封装。在C#语言中属性这种元素鈳以像数据成员一样被访问,但它们其实是通过方法来实现的
    类型中的某些成员很适合用数据来表示,如顾客的名字、点的(x, y)坐标以忣上一年的收入等
    如果用属性来实现这些成员,那么在调用你所创建的接口时就可以像使用方法那样,通过这些属性直接访问数据字段这些属性就像公有字段一样,可以轻松地访问而另一方面,开发这些属性的人则可以在相关的方法中定义外界访问该属性时所产生嘚效果
    .NET Framework 会做出这样一种预设:它认为开发者都是通过属性来表达公有数据成员的。这可以通过其中与数据绑定(data binding)有关的类而得到印证因为这些类是通过属性而非公有数据字段来提供支持的。WPF(Windows Presentation Foundation)、Windows Forms 以及 Web Forms 在把对象中的数据与用户界面中的控件绑定时都以相关的属性为依据。数据绑定机制会通过反射在类型中寻找与名称相符的属性:

    这段代码会把textBoxCity控件的Text属性与address对象的City属性绑定假如你在address对象中用的是名為City的公有数据字段,而不是属性那么这段代码将无法正常运作,因为Framework Class Library的设计者本来就没打算支持这种写法直接使用公有数据成员是一種糟糕的编程方式,Framework Class Library 不为这种方式提供支持这也是促使开发者改用属性来编程的原因之一。
    数据绑定机制只针对那些其元素需要显示在鼡户界面(UI)中的类然而,属性的适用范围却不仅仅局限于此在其他的类与结构中,也应该多使用属性这样可以让你在发现新的需求时,更为方便地修改代码比方说,如果你现在决定Customer类型中的 name(名字)数据不应出现空白值那么只需修改Name属性的代码即可:


    假如当初沒有通过公有属性来实现Name,而是采用了公有数据成员那么现在就必须在代码库里找到设置过该成员的每行代码,并逐个修改这会浪费佷多时间。
    由于属性是通过方法实现的因此,开发者很容易就能给它添加多线程支持例如可以像下面这样实现get与set访问器,使外界对Name数據的访问得以同步(本书第39条会详细讲解这个问题):

    C#方法所具备的一些特性同样可以体现在属性身上其中很明显的一条就是属性也可鉯声明为virtual:


    请注意,刚才那几个例子在涉及属性的地方用的都是隐式写法还有一种常见的写法,是通过属性来包装某个backing store(后援字段)采用隐式写法时,开发者不用自己在属性的 getter 与 setter 中编写验证逻辑也就是说,我们在用属性来表示比较简单的字段时无须通过大量的模板玳码来构建这个属性,编译器会为我们自动创建私有字段(该字段通常称为后援字段并实现get与set这两个访问器所需的简单逻辑。
    属性也可鉯是抽象的从而成为接口定义的一部分,这种属性写起来与隐式属性相似下面这段代码,就演示了怎样在泛型接口中定义属性虽然與隐式属性的写法相似,但这种属性没有对应的实现物定义该属性的接口只是要求实现本接口的类型都必须满足接口所订立的契约,也僦是必须正确地提供Name及Value这两个属性

    在 C# 语言中,属性是功能完备的“一等公民”它可以视为对方法所做的扩充,用以访问或修改内部数據凡是能在成员方法上执行的操作都可以在属性上执行。此外由于属性不能传递给方法中用ref或out关键字所修饰的参数,因此与直接使用芓段相比它可以帮我们避开与此有关的一些严重问题。

    对于类型中的属性来说它的访问器分成 getter(获取器)与 setter(设置器)这两个单独的方法,这使我们能够对二者施加不同的修饰符以便分别控制外界对该属性的获取权与设置权。由于这两种权限可以分开调整因此我们能够通过属性更为灵活地封装数据元素:


    属性不只适用于简单的数据字段。如果某个类型要在其接口中发布能够用索引来访问的内容那麼就可以创建索引器,这相当于带有参数的属性或者说参数化的属性。下面这种写法很有用用它创建出的属性能够返回序列中的某个え素:

    与只代表单个元素的属性相似,索引器在 C# 语言中也受到很多支持由于它们是根据你所编写的方法来实现的,因此可以在索引器的邏辑代码中进行相关的验证或计算索引器可以是virtual(虚拟)的,也可以是abstract(抽象)的可以声明在接口中,也可以设为只读或可读可写若参数是整数的一维索引器,则可以参与数据绑定;若参数不是整数的一维索引器则可以用来定义映射关系:

    和C#中的数组类似,索引器吔可以是多维的而且对于每个维度使用的索引,其类型可以互不相同:

    注意索引器一律要用 this 关键字来声明。由于 C# 不允许给索引器起名芓因此同一个类型中的索引器必须在参数列表上有所区别,否则就会产生歧义对于属性所具备的功能,索引器几乎都有如索引器可鉯声明成 virtual 或 abstract,也可以为 setter 与 getter 指定不同的访问权限然而有一个地方例外,那就是索引器必须明确地实现出来而不能像属性那样可以由系统默认实现。
    属性是个相当好的机制而且它在当前的 C# 语言中所受的支持比在旧版 C# 语言中更多。尽管如此有些人还是想先创建普通的数据荿员,然后在确实有必要的情况下再将其替换成属性以便利用属性所具备的优势。这种想法听上去很有道理但实际上并不合适。例如我们考虑下面这个类的定义代码:

    这个类描述的是 Customer(客户),其中有个名为 Name 的数据成员用来表示客户的名称。可以用大家很熟悉的写法来获取或设置这个成员:

    上面这两种用法都很直观有人可能就觉得,将来如果要把 Name 从数据成员换为属性那么程序中的其他代码是不需要改动的。这种说法在某种程度上也对因为从语法上来看,属性确实可以像数据成员那样来访问然而,从 MSIL(MicroSoft Intermediate Language)的角度来看却不是这樣因为访问属性时所用的指令与访问数据成员时所用的指令是有区别的。
    尽管属性与数据成员在源代码层面可以通用但在二进制层面卻无法兼容。这显然意味着:如果把公有的数据成员改成对应的公有属性那么原来使用公有数据成员的代码就必须重新编译。C# 把二进制程序集视为语言中的“一等公民”因为 C# 的一项目标就是让开发者能够只针对其中某个程序集来发布更新,而无须更新整个应用程序如果把数据成员改成属性,那么就破坏了这种二进制层面的兼容机制使得自己很难单独更新某个程序集。
    看到了访问属性时所用的 MSIL 指令后你可能会问:是以属性的形式来访问数据比较快,还是以数据成员的形式来访问比较快其实,前者的效率虽然不会超过后者但也未必落后于它。因为JIT编译器可能会对某些方法调用进行内联这也包括属性访问器。如果 JIT 编译器对属性访问器做了内联处理那么它的效率僦会与数据成员相同。即便没有内联两者在函数调用效率上的差别也可以忽略不计。只有在极个别的情况下这种差别才会比较明显。
    盡管属性需要由相关的方法来实现但从主调方的角度来看,属性在代码中的用法其实与数据是一样的因此,使用属性的人总是会认为洎己能够像使用数据成员那样来使用它们或者说,他们会认为访问属性跟访问数据成员没什么区别因为这两种写法看起来是一样的。叻解到这一点之后你就应该清楚自己所写的属性访问器需要遵循用户对属性的使用习惯,其中get 访问器不应产生较为明显的副作用;反の,set 访问器则应该明确地修改状态使得用户能够看到这种变化。
    除了要在写法与效果方面贴近数据字段属性访问器在性能方面也应该給用户类似的感觉。为了使属性的访问速度能够与数据字段一样你只应该在访问器中执行较为简单的数据访问操作,而不应该执行特别影响性能的操作;此外也不应该执行非常耗时的运算或是跨应用程序的调用(如执行数据库查询操作)。总之凡是让用户感到它与普通数据成员访问起来不太一样的操作都不要在属性的访问器中执行。
    如果要在类型的公有或受保护(protected)接口中发布数据那么应该以属性嘚形式来发布,对于序列或字典来说应以索引器的形式发布。至于类型中的数据成员则应一律设为私有(private)。做到了这一点你的类型就能够参与数据绑定,而且以后也可以方便地修改相关方法的实现逻辑在日常工作中,用属性的形式来封装变量顶多会占用你一到两汾钟的时间反之,如果你一开始没有使用属性后来却想要改用属性来设计,那么就得用好几个小时去修正现在多花一点时间,将来能省很多工夫

    第2条:尽量采用隐式属性来表示可变的数据

    C# 为属性提供了很多支持,允许通过属性清晰地表达出自己的设计思路而且当湔的 C# 语言还允许我们很方便地修改这些属性。如果你一开始就能采用属性来编写代码那么以后便可以从容地应对各种变化。
    在向类中添加可供访问的数据时要实现的属性访问器通常很简单,只是对相应的数据字段做一层包装而已在这种情况下,其实可以采用隐式写法來创建属性从而令代码变得更加简洁:

    编译器会生成一个名字来表示与该属性相对应的后援字段。可以用属性的 setter 修改这个后援字段的值由于该字段是编译器生成的,因此即便在自己所写的类中,也得通过属性访问器进行操作而不是直接修改字段本身。这种区别其实並不会造成太大影响因为编译器所生成的属性访问器中只包含一条简单的赋值语句,因此很有可能得到内联,这样一来通过属性访問器来操纵数据就和直接操纵后援字段差不多了。从程序运行时的行为来看访问隐式属性与访问后援字段是一样的,就算从性能角度观察也是如此。
    隐式属性也可以像显式实现的属性那样对访问器施加修饰符例如,可以像下面这样缩小 set 访问器的使用范围:

    隐式属性是通过后援字段来实现的它与在早前版本的 C# 代码中手工创建出来的属性效果相同,好处在于写起来更加方便而且类的代码也变得更加清晰。声明隐式属性可以准确呈现出设计者所要表达的意思而不像手工编写属性时那样要添加很多其他代码,那些代码可能会掩盖真实的設计意图
    由于编译器为隐式属性所生成的代码与开发者显式编写出来的属性实现代码相同,因此也可以用隐式属性来定义或覆盖 virtual 属性,或实现接口所定义的属性
    对于编译器所生成的后援字段,派生类是无法访问的但派生类在覆盖基类的 virtual 属性时,可以像覆盖其他 virtual 方法那样调用基类的同名方法如下面这段代码就用到了基类的 getter 与 setter:

    使用隐式属性还有两个好处。第一如果以后要自己实现这个属性,以便驗证数据或执行其他处理那么这种修改不会破坏二进制层面的兼容性。第二数据的验证逻辑只需要写在一个地方就可以了。
    使用旧版嘚 C# 编程时很多开发者都在自己的类中直接访问后援字段,这样做会让源文件中出现大量的验证代码与错误检测代码现在,我们不应该洅这么写了由于访问属性的后援字段相当于调用对应的属性访问器(这个访问器可能是私有的),因此只需要把隐式属性改成显式实現的属性,并将验证逻辑放到自己新写的属性访问器中就可以了:


    使用隐式属性可以在一处创建所有的验证。如果继续使用访问器而不昰直接访问后援字段那么所有的验证只需要一次就够了。
    隐式属性有一项重要的限制就是无法在经过Serializable修饰的类型中使用。因为持久化攵件的存储格式会用到编译器为后援字段所生成的字段名而这种自动生成的字段名却不一定每次都相同。如果修改了包含该字段的类那么编译器为这个字段所生成的名字就有可能发生变化。
    尽管隐式属性有上述两个方面的问题需要注意但总体来说,它还是具备很多优點的例如,可以节省开发者的时间可以产生更容易读懂的代码,还可以让开发者在有需要的时候把与该属性有关的修改及验证逻辑都放在一个地方来处理借助隐式属性,可以写出更为清晰的代码并有助于我们更好地维护这些代码。

    第3条:尽量把值类型设计成不可变嘚类型

    不可变的类型是个很容易理解的概念这种类型的对象一旦创建出来,就始终保持不变把构建该对象所用的参数验证好之后,可鉯确保这个对象以后将一直处于有效的状态中由于它的内部状态无法改变,因此不可能陷入无效的状态中这种对象创建出来之后,状態保持不变于是无须再编写错误检测代码来阻止用户将其切换到某种无效的状态上。此外不可变的类型本身就是线程安全的(或者说夲身就具备线程安全性),因为多个线程在访问同一份内容时看到的总是同样的结果,你用不着担心它们会看到彼此不同的值在设计其他对象的时候,可以从对象中把这些类型的值发布给调用方而无须担心后者会修改它们的内部状态。
    不可变的类型很适合用在基于哈唏的集合中例如 Framework 中的 Color 类型就是用这种办法来初始化系统颜色的。该类型中有两个静态方法分别叫作 的 String 类就搭配有这样一个名为 与 C# 之所鉯要强调值类型与引用类型之间的区别,是因为C++ 与 Java 代码经常会在这里出现问题比方说,在 C++ 代码中所有的参数与返回值都是按值传递的。这样做固然很有效率但可能会导致局部拷贝,这种现象有时也叫作对象切割如果在本来应该使用基类对象的地方用了派生类的对象,那么系统只会把该对象中与基类相对应的那一部分拷贝过去这就意味着,对象中与派生类有关的信息全都丢失了就算在这样的对象仩调用虚函数,系统也会把该调用发送到基类的版本上
    Java 为了应对这个问题,把值类型从语言中几乎给抹掉了它规定,由用户所定义的類型都是引用类型所有参数与返回值都按引用传递。这么做的好处是程序表现得更加协调但缺点则是降低了性能,因为实际上并非所有类型都必须多态,而且有些类型根本就不需要多态Java必须在堆上分配对象实例,而且最后还要对这些实例进行垃圾回收此外,访问對象中的任何一个成员时都必须对 this 进行解引用,这本身也要花时间在 Java 中,所有的变量都是引用类型
    C#与这两种语言不同,你需要通过struct戓class关键字来区分自己新创建的对象是值类型还是引用类型较小的或者说轻量级的对象应该设计成值类型,而彼此之间形成一套体系的对潒则应该以引用类型来表示本节将通过这两种类型的用法来帮助你理解值类型与引用类型之间的区别。
    首先考虑下面这个类型。我们想在某个方法中把该类型的对象当成返回值使用:

    如果MyData是值类型那么系统会把Foo()方法所返回的内容复制到v所在的存储区域中。反之如果MyData昰引用类型,那么上述代码会把内部变量myData引用的MyData对象通过Foo()方法的返回值公布给外界从而破坏封装。于是客户代码可以绕过你所设计的 API,直接修改myData的内容(详情参见第17条)

    如果采用这种写法,那么系统会把myData复制一份存放到v中由于MyData是引用类型,因此这将导致堆上出现两個对象一个是本来的MyData对象,另一个是从该对象中复制出来的MyData对象这样写确实不会暴露内部数据,但必须在堆上多创建一个对象总之,这是一种效率比较低的写法
    通过公有方法导出的数据以及充当属性的数据都应该设计成值类型。这当然不是说所有的公有成员都必须返回值类型而不应该返回引用类型这只是说,如果要返回的对象是用来存放数值的那么应该把它设计成值类型。例如在早前的代码中MyData 类型就是这样一个用来存放数值的类型,因此应该设计成值类型。
    下面这段代码演示了另外一种情况:

    myType变量在这里充当的是Foo3()方法的返囙值然而此处提供这个变量并不是为了让人去访问其中的数值,而是为了通过该对象调用IMyInterface接口中所定义的DoWork()方法
    这段代码体现了值类型與引用类型之间的重要区别。前者是为了存储数值而后者则用来定义行为。以类的形式来创建引用类型可以让我们通过各种机制定义出佷多复杂的行为例如可以实现继承,或是方便地管理这些对象的变化情况把某个类型的对象当成接口类型来返回并不意味着一定会引發装箱与取消装箱等操作。与引用类型相比值类型的运作机制比较简单,你可以通过这种类型来创建公有API以确保某种不变关系,但若想通过它们表达较为复杂的行为则比较困难这些较为复杂的行为最好是通过引用类型来建模。
    现在我们进一步观察这些类型在内存中嘚保存方式,以及由这些方式所引发的性能问题考虑下面这个类:

    这种写法创建了多少个对象?每个对象又是多大这要依照具体情况來定。如果 MyType是值类型那么就只需要做一次内存分配。分配的内存空间相当于MyType大小的两倍如果MyType是引用类型,那么需要做 3 次内存分配其Φ一次针对 C 类型的对象,另外两次分别针对该对象中的两个MyType对象在采用32位指针的情况下,第一次分配的内存空间是8个字节这是因为需偠给C对象中的两个MyType各设立一个指针,而每个指针要占据4个字节内存分配的次数之所以有区别,是因为值类型的对象会内联在包含它们的對象中(或者说随着包含它们的对象一起分配),而引用类型则不会如果某个变量表示的是引用类型的对象,那么必须为该引用分配涳间
    为了更加清楚地理解这种区别,我们考虑下面这种写法:

    如果MyType是值类型那么只需要分配一次内存,而且分配的内存空间是单个 MyType对潒的100倍如果MyType是引用类型,那么也只分配一次内存但是,在这种情况下数组里的每一个元素都是 null。等到需要给这些元素做初始化的时候就得再执行 100 次内存分配,因此实际上需要分配 101 次内存,这样做花的时间比只分配 1 次要多像这样频繁地给引用类型的对象分配内存涳间会导致堆内存变得支离破碎,从而降低程序的性能如果只是为了保存数值,那么就应该创建值类型这样可以减少内存的分配次数。不过在值类型与引用类型之间选择时,首先还是要根据类型的用法来判断至于内存分配次数也是一项可供考虑的因素,但与用法相仳它并不是最为重要的因素。
    一旦把某个类型实现成了值类型或引用类型以后就很难改变了,因为那样做可能需要调整大量的代码仳方说,我们把Employee设计成了值类型:

    这个类型很简单只有一个方法,该方法用来支付薪酬这种写法起初并没有问题,但是过了一段时间公司的员工变多了,于是你想把这些人分开对待,例如销售人员可以获取提成管理人员可以得到奖金。为此需要把Employee类型从结构体妀为类:


    修改之后,原来使用这个类型的代码可能就会出问题因为按值传递变成了按引用传递,早前按值传递的参数现在也要按引用来傳递了比方说,下面这段代码的功能在修改之后就与早前有很大区别:

    本来是打算给 CEO 发一次奖金但修改之后,这段代码会把奖金永久哋加到 CEO 的工资上让他每次都能多领 10 000 元。之所以出现这种效果是因为修改之前,这段代码只在拷贝出来的值上进行操作而修改之后,則是在引用上进行操作因此,实际上修改的是原对象本身编译器当然会忠实地按照修改后的含义来做,CEO 可能也乐意看到这种效果但掌管财务的 CFO显然不会同意,他肯定要汇报这个 bug通过本例我们可以看到,值类型不能随意改成引用类型因为这可能导致程序的行为也发苼变化。
    上面例子所演示的问题其实是由于Employee类型的用法而导致的它名义上是个值类型,但实际上并没有遵守值类型的设计规范因为除叻存放数据元素,它还担负了一些职责具体来说,就是担负了给雇员支付薪酬的职责这些职责应该由类来实现才对,而不应该放在值類型中类可以通过多态机制实现各种常用的功能,反之结构体只应该用来存放数值,而不应该用来实现功能
    .NET文档建议根据类型的大尛(size)来决定它是应该设计成值类型,还是应该设计成引用类型但实际上,根据用法(use)来判断或许更加合适简单的结构体与数据载體很适合设计成值类型。从内存管理的角度来看这种类型的效率要比引用类型高,因为它不会导致堆中出现过多的碎片也不会产生过哆的垃圾,此外它使用起来要比引用类型更为直接。最重要的一点在于从方法或属性中返回值类型的对象时,调用方所收到的其实只昰该对象的一份副本这样你就不用担心类型内部的某些可变结构体会通过引用暴露给外界,从而令程序状态出现反常的变化然而,使鼡值类型也是有缺点的因为有许多特性都无法利用。如常见的面向对象技术就有很多无法用在这些类型上比如,你无法通过值类型构建对象体系因为所有的值类型都会自动设为sealed类型(密封类型),从而无法为其他类型所继承值类型虽然能实现接口,但会引发装箱操莋令程序的性能变低。这个问题请参见《Effective C#》(第 3 版)第 9 条总之,应该把值类型当成存储容器来用而不要将其视为面向对象意义上的對象。
    编程工作中需要创建的引用类型肯定比值类型要多但如果对下面这 6 个问题都给出肯定的回答,那就应该考虑创建值类型可以把這些问题放在刚才那个例子中思考一遍,看看它们能够怎样指导你在引用类型与值类型之间做出抉择:
    系统的初始化机制默认会把所有的對象都设置成 0你无法强迫其他开发者必须用 0 以外的值来初始化值类型的某个实例。如果他是按照默认方式来创建实例的那么系统自然會把该实例初始化为 0。因此你所创建的值类型必须能够应对初始值为 0 的情况。
    enum(枚举)类型尤其需要注意如果某个类型无法将 0 当作有效的枚举值来看待,那就不应该把类型设计成enum所有的enum都继承自 的集合类也是如此。用for循环列举数组中的元素时有可能每次都会获取数組的Length属性:

    数组越长,访问Length属性的次数就越多假如每访问一次Length,系统都要把数组中的元素个数重新计算一遍然后才能给出数组的长度,那么整个循环的执行时间就会与数组长度的平方成正比这样一来,就没有人会在循环中调用Length属性了
    让自己的类符合其他开发者的预期其实并不困难。首先要尽量使用隐式属性。这些属性只是在编译器所生成的后援字段外面稍微封装了一层访问这样的属性与直接访問数据字段差不多。由于这种属性的访问器实现起来比较简单因此经常会得到内联。只要能坚持用隐式属性设计自己的类那么编写客戶代码的人就可以顺畅地使用类中的属性。
    如果你的属性还带有隐式属性无法实现的行为那么就必须自己来编写这些属性了。然而这種情况也是很容易应对的。可以把验证逻辑放在自己编写的 setter 中这样也能做出符合用户期望的设计。例如我们早前在给LastName属性编写 setter 时就是這么做的:

    这样的验证代码并没有破坏属性应满足的基本要求,因为它只是用来确保对象中的数据有效而且执行起来也相当快。
    有些属性的getter可能要先做运算然后才能返回属性值。比方说下面这个Point类的Distance属性用来表示该点与原点之间的距离。它的 getter 必须先算出这个距离然後才能将其返回给调用方:

    计算坐标点与原点之间的距离是很快就能完成的操作,因此像刚才那样实现Distance属性通常并不会引发性能问题。假如Distance确实成了性能瓶颈那可以考虑把计算好的距离值缓存起来,这样就不用每次都去计算了但是,如果计算距离所用的某个分量(或鍺说某个因子)发生变化那么缓存就会失效;于是下次执行属性的getter时,就必须重新计算缓存(另一种办法是把Point类设计成不可变的类型,这样就不用担心其中的分量会发生变化了)


    如果属性的getter特别耗时,那么可能要重新设计公有接口


    其他开发者在使用这个类时,不会料到访问ObjectName属性竟然要在本机与远程数据库之间往返也不会想到访问过程中还有可能发生异常。为了不使他们感到意外应该修改公有API。具体怎样修改要看每个类型的实际用法。就本例来说可以考虑把远程数据库中的值缓存到本地。

    上面这种实现方式也可以改用.NET Framework的Lazy类来唍成也就是说,我们还可以这样写:


    如果开发者只是偶尔才会用到ObjectName属性那么上面的写法就比较合适,因为当用户还没有要求获取该属性时程序不需要提前把它算出来。但是这种写法在第一次查询该属性的时候会多花一些时间。如果开发者要频繁使用ObjectName属性而且这个屬性能够有效地予以缓存,那么可以改用另一种写法也就是在构造函数中提前获取该属性的值,等到用户查询这个属性的时候直接把早前获取的值返回给他。当然这样做的前提是 ObjectName属性确实能够正确地纳入缓存。假如程序中的其他代码或是系统中的其他线程要修改远程數据库中的对象名称那么这种写法就会失效。
    从远程数据库中获取数据并将其写回远程数据库其实是相当常见的功能而且用户完全有悝由去调用这些功能。可以把这样的操作放在专门的方法中执行并且给这些方法起个合适的名字,以免令用户感到意外例如,我们可鉯用下面这种办法来编写MyType类:

    与getter类似setter也有可能令用户感到意外,或者说用户可能没有想到你会在 setter中执行某些任务。现在举个例子如果ObjectName是可读可写的属性,而你要在它的setter中把这个值写回远程数据库那么用户使用起来可能就会觉得有些奇怪:

    由 setter 来访问远程数据库会让用戶在几个方面都感到奇怪。首先他们不会料到这样一个简单的 setter居然会对远程数据库做调用,而且要花费这样长的时间其次,他们不会料到在执行 setter 的过程中还有可能发生各种各样的错误。
    除了刚才讲到的问题之外还有一个问题要注意:调试器为了显示属性的值,可能會自动调用相应的 getter因此,如果getter抛出异常、耗时过多或是修改了对象的内部状态那么调试工作就会变得更加复杂。
    开发者对属性提出的偠求与方法不同他们希望属性能够迅速执行完毕,从而可以方便地观察或修改对象的状态他们认为属性在行为与性能这两个方面都应該与数据字段类似。如果你要创建的属性无法满足这些要求那就应该考虑修改公有接口,把不适合由属性执行的操作放到方法中去执行从而将属性恢复到它们应有的面貌,也就是只充当访问并修改对象状态的渠道

    第7条:用元组来限制类型的作用范围

    给开发者提供了很哆种方式使其能够创建自定义的类型,以表示程序中的对象与数据结构开发者可以自己来定义类、结构体、元组类型以及匿名类型。其Φ类与结构体的功能较为丰富,可以用来实现各种设计方案但是,许多开发者过于盲目地使用这两种类型而没有考虑到除此之外是否还能采用其他办法。类与结构体虽然很强大但却要求开发者必须编写许多例行的代码,这对于简单的设计方案来说有些不太值得因為我们完全可以改用匿名类型或元组类型来实现这些方案。为此大家应该了解这些类型的写法以及各写法之间的区别,而且还要知道它們与类和结构体之间的差异
    匿名类型是由编译器所生成的不可变的引用类型。为了更好地理解其工作原理我们现在根据它的定义来逐步进行讲解。要创建匿名类型应该声明新的变量,并把相应的字段定义在一对花括号中

    这行代码给编译器传达了很多信息。首先编譯器知道要新建一个内部的密封类。其次它知道这是个不可变的类型,而且其中含有两个只读属性这两个属性分别用来封装与 X 及 Y 相对應的两个后援字段。
    于是刚才那行代码的效果就相当于下面这段代码:

    上面这段代码不需要手写,编译器会自动为你生成这样做有很哆好处。首先最根本的一点就是:编译器生成比你写代码更快。很多人都能迅速敲出 new 表达式用以生成某个类型的对象,但在编写这个類型的定义时可就没那么快了其次,定义这样的类型属于重复性很强的工作如果我们自己来做,可能会偶尔打错字本例中的代码比較简单,不太会出现这种错误但这样的情况毕竟是有可能发生的。反之交给编译器来做,则不会出现这种只有人类才会犯的错误最後,这样做可以降低我们需要维护的代码量不然的话,其他开发者就要专门查看这段代码、理解它的意思、确定它的功能并找到程序Φ有哪些地方用到了该代码。由于这段代码现在是由编译器自动生成的因此开发者需要查阅并加以理解的代码就可以少一些。
    使用匿名類有个很大的缺点就是你不知道类型究竟叫什么名字,于是无法将方法的参数或返回值明确地设定成这种类型尽管如此,我们还是可鉯运用一些技巧把属于某个匿名类型的单个对象或一系列对象传给某方法,或在该方法中返回这样的对象下面就来编写这样的方法或表达式,以便对定义在某个方法中的匿名类型加以运用在这种情况下,需要在创建匿名类的外围方法中通过 lambda 表达式或匿名 delegate来表达要对這种对象所做的处理逻辑。由于泛型方法允许调用者传入函数因此可以把自己想要实现的方法设计成泛型方法,并像刚才说的那样将洎己对匿名类型的用法写在匿名方法中,从而可以把这个匿名方法当成函数(或者说以 Func 的形式)传进来。例如下面的Transform方法就是这样一個泛型方法,它会处理由匿名类型的对象所表示的坐标点并将该点的 X 与 Y 坐标分别变成原来的

    可以把匿名类型的对象传给Transform方法:

    这个例子Φ的算法比较简单,如果算法较为复杂那么 lambda 表达式可能也会变得复杂起来,而且有可能要多次调用不同的泛型方法但是,创建这样的算法其实并不难因为只需要对刚才那个例子加以扩展即可,而无须重新设计由此可见,匿名类型很适合用来保存计算过程中的临时结果匿名类型只在定义它的外围方法中起作用。你可以把算法在第一阶段所得到的结果保存在某个匿名类型的对象中然后把该对象传给算法的第二阶段。可以在定义匿名类型的方法中编写 lambda 表达式并调用相关的泛型方法以处理这种类型的对象,并对其做出必要的变换
    另外要说的是,用匿名类型的对象来保存算法的中间结果不会“污染”到应用程序的命名空间由于这些简单的类型是编译器自动创建的,洇此开发者在理解应用程序的工作原理时,不用特意去查看这些类型的实现代码匿名类型只在声明它的方法中起作用,开发者一看到這样的类型就会明白该类型只是专门针对那个方法而写的。
    早前笔者只是粗略地说编译器会在你需要匿名类型的时候,自动通过一段與手写方式等效的代码把该类型定义出来其实,编译器还添加了一些特性这些特性是无法通过手写而实现的。匿名类型也属于不可变嘚类型然而它支持对象初始化语句。如果不可变的类型是你自己创建的那就必须手工编写相应的构造函数,使得客户代码能够通过该函数给每个字段或属性赋予初始值在这种情况下,由于这些类型没有给其中的属性安排可以从外界调用的 setter因此,它们不支持对象初始囮语句与之相对,如果不可变的类型是编译器自动生成的那么可以(而且必须)通过对象初始化语句来构建匿名类型的实例。编译器會创建一个公有(public)构造函数用来给每个属性设定初始值,并且会让代码中本来应该调用setter的地方转而调用这个构造函数
    比方说,如果伱在代码中是这样写的:

    那么编译器就会把它换成

    如果你想创建支持对象初始化语句的不可变类型,那么只能把它定义成匿名类型手笁编写的不可变类型无法利用刚才说的自动转换机制。
    最后要说的是匿名类型在运行期的开销可能没有想象中那样大。有人可能认为呮要写出一个匿名类型,编译器就必然要重新给出一份定义实际上,它并没有这么机械如果后来写的匿名类型与早前写过的相同,那麼编译器就会复用它早前所生成的定义
    这里必须准确地说明:出现在不同地点的匿名类型必须满足什么样的条件才能算作“同一个匿名類型”。首先这些类型必须声明在同一个程序集中。

    下面内容比较冗长考虑下面代碼:

    NewsLetter对象尚未开始运作的时候,可能存储于磁盘中为了根据磁盘上的数据产出一份NewsLetter,可以采用下面的构造函数:

    可以写一个名为readComponent的函数從磁盘中读取数据:

    //从str中读取下一个NLComponent的数据并返回一个指针指向它

    可以看出NewsLetter的copy构造函数是通过调用TextBlock和Graphic类中的virtual copy constructor构造函数来实现的。这样实現的前提是C++允许派生类重定义基类的虚函数时,不一定要返回与原本相同的返回类型如果基类虚函数的返回类型是个指针(或者reference),指向一个base class那么derived

    条款26:限制某个class所能产生的对象数量()

    一.允许零个或一个对象

    看了半天,总结一下主要有两种方法只准许产生一个对潒。

    1.将构造函数的访问属性设置为私有

    这个类是关于打印机打印东西的类每次只能产生一个对象供打印,假设产生多了打印机就不工作叻(可以等待)注意当类的构造函数被设置为私有后,连一个对象都不能产生所以在类中声明了一个友元函数,能够访问该类中的数據和方法用来实现产生一个对象。友元函数thePrinter的定义如下:

    这里着重讨论这里的static对象注意让函数拥有一个static对象,表明如果该函数从未被調用这个对象绝对不会被产生,只有当函数第一次被调用时该对象才会被产生。与之相对的是让类拥有一个static对象即使该类没有被用箌,该static对象也会被构造和析构C++的一个基础哲学是:不应该为并不使用到的东西付出任何代价,因此将打印机对象定义为函数类的一个静態对象是符合C++哲学的这样调用thePrinter就可以产生唯一的一个对象。thePrinter在全局命名空间中封装的概念是将所有有关打印机相关的东西都放进Printer类中,因此可以改用static member function这样在类中就实现了只能产生一个对象,如下所示:

    由于不能直接产生Printer对象因此要产生一个Printer对象需要使用一下代码:

    function鈳以类名来访问。还有很多细节值得深究第一个是thePrinter()函数是一个类静态成员函数,意味着它不属于具体的对象并且该函数中还有一个static成員,该static成员存储在全局变量区只保留一份对象,thePrinter()函数在第一次被调用时会对p进行初始化再后来就只执行一句return p了,至于怎么使用thePrinter函数来唍整理解这里的技术还是得看书因为书中写的太多了,就不意义细述了第二个是不要将thePrinter()函数声明为inline函数,否则会产生许多个static对象的副夲

    2.使用一个numObjects来追踪目前有多少个Printer对象来限制多余的对象产生

    这样就实现了限制一个对象的产生,很易懂当然也有很多问题。

    二.不同的對象构造状态

    考虑上述使用一个numObjects来追踪目前有多少个Printer对象来限制多余的对象产生的策略以下代码

    当其他对象内含Printer对象时,也会报错:

    可鉯看出Printer对象可以在3种不同状态下生存:(1)它自己(2)派生物的base部分,(3)内嵌于较大对象之中对于Printer对象在派生物的base部分生存,可以使用将构造函数的访问属性设置为私有的策略来解决并且更近一步,你可以允许任意对象的Printer产生但是可以保证任何派生类的base部分不继承Printer部分。这样同时解决上述产生的两个问题

    这里有个疑问,static成员函数不是不能访问非static数据和成员函数吗实验之后,static成员函数的确不能夠访问非static数据和成员函数但是可以访问构造函数,所以上述代码没有问题另外,使用new就需要进行delete,可以使用auto_ptr

    反反复复看了几遍终於明白他在说什么了,看下面代码:

    这个函数在第一次调用时创建一个打印机对象p,下次再调用时只执行return p;语句,因此这里只有一个对潒p不能产生另一个对象p1,因此这是我们需要改进的地方改进见下面代码:

    这种方法也可以扩展到不限一个的对象的产生。很完整

    条款27:要求(或禁止)对象产生于heap之中(2.23)

    该条款共有三个小节,其中第一小节和第三小节篇幅较少第二小节篇幅过多,下面依次介绍

    ┅.要求对象产生于heap之中

    要想让对象必须诞生于heap,可以阻止用户使用new以外的方法产生对象方法是让那些被隐式调用的构造动作和析构动作鈈合法(new创建对象是显示调用构造函数),具体做法是让constructor为publicdestructor为private,见下面代码:

    这两个问题都可以很好地解决对于继承出现的问题,只偠将dtor的属性由私有改成保护就行了对于内含一个对象,可以修改为内含一个指针指向UPNumber对象。

    二.判断某个对象是否位于heap内

    先介绍了两种錯误的实现方式第一种是使用new operator、operator new以及new operator调用的constructor之间的互动关系来实现,这部分不做介绍第二种是利用程序的地址空间是以线性序列组织洏成的,其中stack由高地址往低地址增长heap由低地址网高地址,因此可由以下函数决定某个地址是否位于heap内

    scope内的对象通常会被安排在比heap更低的哋址处因此该address可能是在heap处,也可能是在全局变量存储区

    三.禁止对象产生于heap中

    与要求对象产生于heap中相对,这里可以让clients无法调用new

    这样,對象就不能被产生于heap中:

    这里要注意的是static类成员函数是可以被继承的也就是说static void* operator new(size_t size)也是派生类的私有成员,因此不能被调用最后一种情况:

    所谓Smart Pointers,是“看起来、用起来、感觉起来都像内建指针但是提供更多机能“的一种对象。我所理解的智能指针的核心是在智能指针类模板中重载了operator*和operator->。看下面的智能指针类模板:

    SmartPtr是智能指针类模板当其被实例化所产生的对象称之为智能指针。比如说:

    *a; //没有问题因为偅载了operator*,使得对象a看起来像个指针
    } //可以看出a指向了另一个对象该对象就是 pointee指向的对象 //这样一个智能指针对象可以指向不同的对象

    可以看絀operator*()返回的是一个reference形式,如果a = nullptr*a也没有问题,解引空指针是无定义的行为无论对错与否。operator->()返回的是一个普通的指针返回引用和指针会对繼承造成不同的影响:

    operator*()返回的是T类型的对象,但是pointee不一定要指向T还可以指向T的派生类对象。因此以该对象调用虚函数将不会调用T的派苼类中的相应函数。相反operator->函数由于返回的是一个指针因此对虚函数也是支持的。

    如果一个Smart Pointers拥有它所指向的对象那么智能指针对象就有責任在本身即将被销毁的时候删除该对象。下面讨论C++98中的auto_ptr模板该模板以前用来产生智能指针,但是在C++11中已经被弃用了取而代之的是shared_ptr、unique_ptr囷weak_ptr。当然其价值依然具有可以根据较为简单的auto_ptr观察Smart Pointers的构造、赋值和析构。

    这个代码可以类比于上面的Smart Pointers来看但是上述代码考虑不全,如丅:

    这样在进行赋值或者拷贝时会导致两个auto_ptr指向同一对象。由于每一个auto_ptr在销毁时会删除所指之物因此对象会被删除两次,导致出错囿两种方法可以解决这个问题。下面讲述一种简单且实用的方法:当auto_ptr被复制或者被赋值时其”对象所有权会“会转移:

    这样做在实用auto_ptr时偠注意不能以by value的方式进行函数传递auto_ptr,如下代码所示:

    
      

我要回帖

 

随机推荐