51mobile的个人空间_首页_51Testing软件测试网 - powered by X-Space

我的最新日志

  • 博客收藏

    2008-4-04

  • 网络分析技术学习步骤[转]

    2008-4-04

    网络分析技术学习步骤

    网络分析有以下典型作用:
     查看网络中的流量分布;
    l
     查看网络中的协议分布;l
     查看网络中各主机的通讯信息;l
     快速定位并排查网络故障;l
     找出网络中潜在的安全隐患;l
     查找网络中的蠕虫病毒攻击,黑客攻击,木马攻击;l
     协议学习;l
     。。。。。。l

    对于网络分析的学习,我们推荐按照以下的学习步骤


    首先,必须了解并掌握网络分析的前置知识,只有在掌握相应知识的前提下,才能对网络进行有效的分析


    前置知识1http://www.csna.cn/viewthread.php?tid=626&extra=page%3D2

    前置知识2http://www.csna.cn/viewthread.php?tid=630&extra=page%3D2

    网络分析技术基础知识培训PPThttp://www.csna.cn/viewthread.php?tid=639&extra=page%3D2



    接着,可以了解一些常见的协议


    常见协议简介,http://www.csna.cn/viewthread.php?tid=405&extra=page%3D1

    以太网协议,http://www.csna.cn/viewthread.php?tid=276&extra=page%3D5

    FTP
    协议,http://www.csna.cn/viewthread.php?tid=574&extra=page%3D1

    RIP
    协议,http://www.csna.cn/viewthread.php?tid=594&extra=page%3D1

    OSPF
    协议,http://www.csna.cn/viewthread.php?tid=114&extra=page%3D1

    ICMP
    协议,http://www.csna.cn/viewthread.php?tid=437&extra=page%3D1

    SMB/CIFS
    协议,http://www.csna.cn/viewthread.php?tid=84&extra=page%3D2



    为更有效地学习网络分析技术,下面这些书籍是有必要看的。


    TCP/IP
    详解(卷一),http://www.csna.cn/viewthread.php?tid=605&extra=page%3D1

    TCP/IP
    详解(卷一),http://www.csna.cn/viewthread.php?tid=606&extra=page%3D2

    TCP/IP
    详解(卷三),http://www.csna.cn/viewthread.php?tid=619&extra=page%3D2

    Sniffer
    故障排查,http://www.csna.cn/viewthread.ph ... B%B2%CB%C7%E0%B3%E6

    网络分析经典学习书籍,详见http://www.csna.cn/viewthread.php?tid=286&extra=page%3D2



    工欲善其事,必先利其器。要进行网络分析,我们首先必须理解网络分析软件的工作原理,并将网络分析软件接入到网络中采集数据包,另外,需要学习网络分析软件,学习之后我们即可借助网络分析软件帮助我们分析查找网络的故障。


    网络分析软件安装部署,http://www.csna.cn/viewthread.php?tid=355&extra=page%3D1

    Iris
    软件使用详解,http://www.csna.cn/viewthread.php?tid=264&extra=page%3D1

    Sniffer Pro 4.7
    入门指南,http://www.csna.cn/viewthread.php?tid=57&extra=page%3D1

    Sniffpro 4.7
    专家系统配置指南,http://www.csna.cn/viewthread.php?tid=58&extra=page%3D3

    TCPDUMP
    中文手册,http://www.csna.cn/viewthread.php?tid=469&extra=page%3D1



    不同的网络分析软件,在功能和使用上有着比较大的差别,对这些有深入的理解,将有助于我们选择使用最合适的网络分析软件并快速解决问题。


    网络分析软件过滤器之位过滤功能对比,http://www.csna.cn/viewthread.php?tid=138&extra=page%3D1

    网络分析软件ARP攻击分析功能对比,http://www.csna.cn/viewthread.php?tid=521&extra=page%3D1

    对比网络分析软件过滤IP网段数据通讯,http://www.csna.cn/viewthread.php?tid=164&extra=page%3D6



    学习使用网络分析软件后,我们可以借助网络分析软件对网络故障进行分析。


    某电业局网络故障诊断,http://www.csna.cn/viewthread.php?tid=97&extra=page%3D1

    电信网页访问监控原理分析,http://www.csna.cn/viewthread.php?tid=68&extra=page%3D1

    使用协议分析软件查找网络故障慢的原因,http://www.csna.cn/viewthread.php?tid=198&extra=page%3D1

    使用协议分析软件查看MSN聊天内容,http://www.csna.cn/viewthread.php?tid=152&extra=page%3D1

    使用TTL分析网络故障,http://www.csna.cn/viewthread.php?tid=618&extra=page%3D2

    使用科来网络分析系统捕捉网络中的用户名密码,http://www.csna.cn/viewthread.php?tid=149&extra=page%3D2

    详细的HTTP访问流程分析,http://www.csna.cn/viewthread.php?tid=156&extra=page%3D3

    Email
    邮件分析,http://www.csna.cn/viewthread.php?tid=569&extra=page%3D2

    FTP
    文件传输应用分析,http://www.csna.cn/viewthread.php?tid=1293&extra=page%3D2

    ARP
    攻击与防护完全手册,http://www.csna.cn/viewthread.php?tid=1311&extra=page%3D1

    网络分析,与网络管理紧密结合,常见网络管理员的使用,我们也是可以了解的。


    Solarwinds IP Network Browser
    学习笔记,http://www.csna.cn/viewthread.php?tid=270&extra=page%3D4


    学会网络分析软件的使用,不单单可以查找分析网络故障,还能帮助我们学习相应的协议。

    NetBIOS
    协议分析,http://www.csna.cn/viewthread.php?tid=595&extra=page%3D2

    使用网络分析软件学习HTTP协议,http://www.csna.cn/viewthread.php?tid=371&extra=page%3D1

    CDP
    协议分析,http://www.csna.cn/viewthread.php?tid=479&extra=page%3D4

    使用分析工具学习TCP/IP协议,http://www.csna.cn/viewthread.php?tid=319&extra=page%3D5

    Snitfer Pro Omnipeek Solarwinds 科来网络分析系统

     

  • LR的协议选择【转载】

    2007-10-29

    LR的协议选择

    摘自:fengniao的个人空间

    2007-07-10 17:21:28

    经常看到某些人问LR中如何选择协议,我来谈谈这个问题

    1.LR支持多种协议,请大家一定要注意,这个地方协议指的是你的Client端通过什么协议访问的Server,Client一般是面向最终使用者的,Server是第一层Server端,因为现在的体系架构中经常Server层也分多个层次,什么应用层,什么数据层等等,LR只管Client如何访问第一层Server。

    2.特别要注意某些应用,例如一个Web系统,这个系统是通过ActiveX控件来访问后台的,IE只是一个容器,而ActiveX控件访问后台是通过COM/DCOM协议的,这种情况就不能使用Web协议,否则你什么也录制不到,所以,LR工程师一定要了解应用程序的架构和使用的技术

    3.谈谈多协议

    LR是支持在一个脚本里面使用多协议的,不过这个多协议是有一定的限制的,我有一个LR7.6上哪些协议支持多协议,LR8.0是不是取消了这些限制我不清楚。象HTTPS,一般来讲一定要选择多协议,但在选择具体协议的时候一定只选Web协议,这时候才能作那个端口映射。

    4.谈谈Web协议中Option

    Web协议里面有一些Option,具体我记不清楚了,但有一个地方很重要:就是选择URL方式还是HTM方式录制,这里有一些原则

    a. 尽量使用HTM方式录制

    b.如果使用了Javascrīpt,并且javascrīpt里面与后台有交互,那一定要使用URL方式,例如javascrīpt用于判断用户名和密码是否正确(与后台一定会有交互),那么就要使用URL方式录制;但如果Javascipt只是判断用户名或密码的格式,那一般不会与后台发生交互,就不需要使用URL方式。至于什么情况下一定要用URL方式,我曾经写过一个文档,但现在我不记得了不好意思。

    5.谈谈并发点和结果检查

    很多人喜欢使用并发点和结果检查,我谈谈我自己的看法。第一我基本上从来不使用结果检查,压力测试的结果我一般是去后台检查存储层的数据是否正确的。LR只能检查协议层上的错误,但如果在大量并发用户的情况下使用返回结果检查例如reg_text_check,会极大的占用客户端的资源,我一般不这么作;至于并发点,我只有在客户强烈要求的情况下才会使用,否则基本不用。

  • 关于LR监控Weblogic8的心得

    2007-10-29

    摘自:fengniao的个人空间

    关于LR监控Weblogic8的心得

    2007-05-11 11:23:21

    我前一段时间使用LR8.0测试一个Web应用系统,中间件用的就是Weblogic8.1.5,监控过程中遇到了很多问题,总结出来与大家共享

    1.Controller机器负责监控Weblogic,所以要确认Controller本机使用的JDK与所有服务器上使用的JDK版本一定要一致,这点非常重要,特别是在Cluster环境上。我曾经在这个地方费了很大的力气,而且感觉非常奇怪,为何Controller可以监控一个Web服务器,为什么就不能监控EJB服务器呢?后来统一为j2sdk1.4.2之后,问题才解决了。

    2.按照说明书上的要求修改Web*.ini和一个jar包文件,这点没什么可说的,一定要严格按照这个来修改,否则会出现文档顶层无效的提示。

    3.不要监控太多的指标,监控指标过多,会影响服务器的性能,而且数据没有意义,特别是监控EJB指标的时候,特别要注意这点。

    4.最好先在开始->运行里面用\\方式访问一下被监控的服务器,使用administrator登陆(如果服务器操作系统是Windows的话)。

  • 决定成败的人生细节

    2007-10-29

    决定成败的人生细节

    2007-10-10 15:22:50

    1 坚持在背后说别人的好话
    2 每天向你周围的人问声“早上好”
    3 连续加班后,更要精神饱满
    4 过去的事不要全让人知道
    5 说话时尽量常用“我们”
    6 该问的与不该问的
    7 有人在你面前说别人坏话时,你不要插嘴
    8 人多的场合少说话
    9 与人握手时,可多握一会儿
    10 不是你的功劳,千万不要占有它
    11 尽量不要借朋友的钱
    12 不要轻易承诺
    13 老板错了的时候,你要懂得应对
    14 随便打断别人说话是一种陋习
    15 不要比你的老板穿得更好
    16 主动汇报自己的工作情况
    17 要懂得感恩
    18 不要把谈论别人的缺点当做乐趣
    19 遇事多考虑3分钟
    20 不想因应酬伤害自己,就要注意分寸
    21 上班时与下班时
    22 要想办法让老板知道你做了什么
    23 别忘随时为自己鼓掌
    24 搜集信息还要消化信息
    25 多自我批评,少自我表扬
    26 不要为自己的错误做任何辩解
    27 自以为最了解自己,其实不然
    28 不要负面回应批评
    29 对自己不知道的事情,坦率地说不知道
    30 对事无情,对人要有情
    31 和上司谈话时,关掉你的手机
    32 和客户通电话时,不要先挂掉电话
    33 找借口拒绝时,要尽可能模糊一点
    34 遇到老板,主动迎上去谈几句
    35 给老板的报告里预备一份概要
    36 不要占用公司的一张纸或一支笔
    37 在工作中使用“日常备忘录”
    38 不要在朋友面前炫耀自己
    39 保持办公桌的整洁、有序
    40 只要还能坚持上班就不要请假
    41 做事前,先想像一个好的结果
    42 竞争中要学会欣赏对手
    43 接到额外工作时,不要抱怨
    44 昨晚多几分钟的准备,今天少几个小时的麻烦
    45 出现在公共场合时要保持整洁
    46 向上司请教前,事先想好问题的解决方法
    47 做错事要马上道歉
    48 要学会说善意的谎言
    49 约会时要提前几分钟到达
  • 图片验证码性能测试解决方案『转载』

    2007-10-10

    摘自 木子清风的博客 :http://www.51testing.com/?84226/action_viewspace_itemid_4335.html

    经常看到朋友讨论如何测试图片验证码功能,大家常用的有三种方法:51Testing软件测试网4{6d#T1q}q6j
    1.设置一个万能验证码.
    U9x2q@&O&IN18755 2.取消验证码功能.51Testing软件测试网0n*O\ [ M'd]6?8l
    3.编写个专用插件,动态获取真实的验证码.51Testing软件测试网#Q%g^.DSFp?,D7kw

    )Od+Gi3X/g6\Mg RL(D18755 1,2两种方法实现比较容易,缺点是不能真实的模拟实际应用环境.
    `a6w3X|i18755 3的方法技术难度较高.
    w9K;I:d-An18755 51Testing软件测试网U i+`^#ZJ1ey
    其实我们还有第4种即简单又能够真实的模拟实际应用的方法.
    -bm*F:F dSL18755
    Ywf8o w+Rk|"CK18755 以Jsp网站为例,先来看看验证码功能的实现方法.图片验证码由以下几个步骤实现.
    :U$g v{'P*h18755 1.生成随机数.51Testing软件测试网3y1}2\xS^ ?!]
    2.将随机数存入 Session (会话).51Testing软件测试网K0MScbIP
    3.将随机数制作成图片.51Testing软件测试网$PR&c!BL.A(~uL
    部分较重要的代码如下.51Testing软件测试网7DG7g"@F)p S/Q
    <img src="CheckCode.jsp" border="0" alt="验证....... 这个是调用 CheckCode.jsp 文件,生成图片验证码.51Testing软件测试网\4H'{1\G{W@r
    51Testing软件测试网p(ak"X!r
    CheckCode.jsp文件代码如下51Testing软件测试网6?"c6mG b4H"f
    String sRand="";51Testing软件测试网gn aB'K;Ca ~5Z2D
    for (int i=0;i<4;i++){51Testing软件测试网9o#VVp"J @5@9_
        String rand=String.valueOf(random.nextInt(10));   //生成随机数
    ([td*F5^m18755     sRand+=rand;
    3E\K+zY-_n18755      ..........51Testing软件测试网jW0}#b{Z
    }
    Yy$]J5hAF/Y18755 session.setAttribute("rand",sRand);    将随机数据存入session中.51Testing软件测试网q1B@%oc7k[cW
    51Testing软件测试网c,L Qr Bk%X
    到这里我们已经知道,只要制作一个jsp页面调出session中的rand 值,就可以得到验证码的正文数据.51Testing软件测试网(X-P y&WweiXMa1} _
    实现代码如下.
    9N j(YxQja18755 t.jsp51Testing软件测试网 [}!K o)B iQ
    <%51Testing软件测试网W*l9Ij7n ZD:t]
    out.print(session.getAttribute("rand"));51Testing软件测试网-J5y)ur-Ha_
    %>
    5hrvCr.tJ%ex18755 51Testing软件测试网|Zm;} F?"w:h
    如果在LoadRunner中实现的方法如下:51Testing软件测试网H5VS~.H KU}
    请求 CheckCode.jsp 生成图片验证码.51Testing软件测试网 Idl)S]\u
    请求 t.jsp 获取验证码的正文数据.51Testing软件测试网+P;yb:Rr[h7F
    提交 数据.51Testing软件测试网 gD7vY4Bp H[ |z
    51Testing软件测试网ljGg^-C
    稍后我会上传一个完整的实例,包括B/S验证码应用和LR脚本.请大家稍等.51Testing软件测试网&p#OI)Vk

    Z-WE i%X#CC18755 附件中已经上传了案例和LoadRunner脚本.
    9Ns:_,Qj'F18755 PicVerify 是LoadRunner脚本.
    u(qGY`z0|/C18755 verf 是源代码. 首页文件是reg.jsp51Testing软件测试网2B?m-FQv:Xf*r
    jsp项目的安装与部署方法请参考51Testing软件测试网;N;?Fg,dj8W%b
    搭建测试环境

      下载并安装 Java    地址:http://java.sun.com/javase/downloads/index_jdk5.jsp
       下载并安装 Tomcat   地址: http://apache.justdn.org/tomcat/ ... e-tomcat-5.5.20.zip


      下载并安装Java JDK  (注:假设安装路径为   Java D:\java Tomcat D:\apache-tomcat-5.5.20
      设置Java环境变量
           Path、Java_Home、Class_Path
           操作方法简述:

          环境变量Java_Home 设置:
          桌面 -->右键单击"我的电脑" --> 单击"属性" --> 单击 "高级" --> 环境变量 新建系统环境变量 Java_Home 输入 "D:\Java"

          环境变量Class_Paht 设置:
          新建系统环境变量 Class_Path 输入 ".;%java_home%\lib"
          
          环境变量Paht 修改:
          修改 Path 变量增加"%java_home%\bin"

          验证:
          修改完成后,在Dos窗口中输入java -version 查看Java版本信息。

      下载并安装Tomcat

          配置:
      1.安装数据库驱动:将附件中的Jar文件拷贝到Tomcat的server\lib文件夹中。

      验证
          运行tomcat\bin\startup.bat文件启动Tomcat。在IE地址栏中输入 http://本机IP地址:8080 或 http://127.0.0.1:8080 查看Tomcat信息。
    LoadRunner使用方法请参考  LR使用说明******

    资源:图片验证码 性能测试解决方案** LR脚本

  • 如何用LR监视服务器LINUX的方法『转载』

    2007-9-15

     

    一、在服务器上安装rstatd守护进程
    安装步骤:
    1. 从网上下载rstatd
    2. 将该文件放到/home/user目录下
    3. chmod 777 rpc.rstatd----改变该文件读写的权限,拥有所有权限。
    4. chmod 777 configure ---同上
    5. ./configure ---配置
    6. make ---编译
    7. make install ---安装
    8. rpc.rstatd ---启动rstatd进程

    二、在lr中配置
    从LR里面add measurement, 填写linux机器的IP,出现所有unix/linux的计数器,包括cpu的,mem的,disk,network的。介绍几个常用的:
    average load :在过去的1分钟,的平均负载
    cpu utilization: cpu的使用率
    disk traffic: disk传输率
    paging rate: 每秒从磁盘读到物理内存,或者从物理内存写到页面文件的内存页数
    Swap-in rate: 每秒交换到内存的进程数
    Swap-out rate: 每秒从内存交换出来的进程


    补充一些常见的问题及处理方法:
    1、在执行配置或安装命令过程中出现“拒绝的权限”的提示;
    答:是由于文件的权限引起的,应该给当前用户所有文件的“777”权限,即完全控制权限。

    2、安装好后从LoadRunner中看不到信息,但是没有报错;
    答:可能是返回的信息值比较小,所以在图中几乎看不到,例如:如果没有运行程序的话,CPU的使用率接近于0,所以在监视图中看不到变化。也有可能是采样的频率过大,可以在图表中设置没1秒获取一次信息,这样界面就刷新的比较及时了。

    3、监视一段时间后LoadRunner中提示有错误发生不能继续监视到信息;
    答:可能是由于CPU长时间处于高负荷状态,而导致系统自动关闭了该服务。可以在LoadRunner中重新加一次计数器,并且设置取样的时间稍长一点,就会避免这种情况。

    4、以前用LoadRunner监视都是成功的,但是再次监视不到信息;
    答:有可能是由于系统重新启动,而没有打开rstatd守护进程。可以手工重新打开一次,使用命令“rpc.rstatd”,另外可以使用“rpcinfo -p”命令来查看当前系统是否已经启动了rstatd守护进程。

  • 如何应对面试“面试的十大必考题”『转载』

    2007-9-12

     

    面试时,有几个问题是公司面试人员常常会提出的,针对这些问题好好准备,在面试时也就不会哑口无言,无言以对了,下面就面试十大必考题做出分析:

      (1)为什么想进本公司?

      这通常是面试官最先问到的问题。此时面试官就开始评断录用与否了,建议大家先判断自己去应征的工作性质,是专业能力导向呢,或是需要沟通能力,其实现在市场多以服务为方向,所以口才被视为基本能力之一,所以在此时就要好好表现自己的口才,而口才较差者就务必表现出自己的专业能力即诚意,弥补口才不足的部分。

      回答这个问题时,一定要积极正面,如想要使自己能有更好的发展空间,希望能在相关领域中有所发展,希望能在公司多多学习等等﹔此时可以稍稍夸一下面试公司,但切记一定要诚恳,不然可是会画蛇添足,得不偿失哦!对于社会新鲜人的建议则是,由于之前没有工作经验,所以建议你可以坦承的说出自己的动机,不过用语还是要思考一下。

      (2)喜欢这份工作的哪一点?

      相信其实大家心中一定都有答案了吧!每个人的价值观不同,自然评断的标准也会不同,但是,在回答面试官这个问题时可不能太直接就把自己心理的话说出来,尤其是薪资方面的问题,不过一些无伤大雅的回答是不错的考虑,如交通方便,工作性质及内容颇能符合自己的兴趣等等都是不错的答案,不过如果这时自己能仔细思考出这份工作的与众不同之处,相信在面试上会大大加分。

      (3)自己的优缺点为何?

      有许多面试官都喜欢问这个问题,目的是在于检视人才是否适当,求职者的诚恳度等等,在这之前应该好好分析自己,将自己的优点与缺点列张单子,在其中挑选亦是缺点亦是优点的部分,在回答问题时,以优点作为主要诉求,强调可以为公司带来利益的优点,如积极,肯学习是最普遍的回答,而缺点部分则建议选择一些无伤大雅的小缺点,或是上述那些模嶙两可的优缺点作为回答,这样才不会使面试官太过针对缺点做发挥,造成面试上的困难。

      (4)对公司的了解有多少?

      这时准备的功夫就派上用场,将你之前所吸收的信息发挥出来吧!至少也要知道公司的产品是哪些,提供哪些服务等等,不然面试官一问当场傻在那儿就糗大了,所以一定要事前准备!

      (5)对工作的期望与目标何在?

      这是面试者用来评断求职者是否对自己有一定程度的期望、对这份工作是否了解的问题。对于工作有确实学习目标的人通常学习较快,对于新工作自然较容易进入状况,这时建议你,最好针对工作的性质找出一个确实的答案,如业务员的工作可以这样回答:“我的目标是能成为一个超级业务员,将公司的产品广泛的推销出去,达到最好的业绩成效;为了达到这个目标,我一定会努力学习,而我相信以我认真负责的态度,一定可以达到这个目标。”其他类的工作也可以比照这个方式来回答,只要在目标方面稍微修改一下就可以了。

      (6)为什么要离职?

      回答这个问题时一定要小心,就算在前一个工作受到在大的委屈,对公司有多少的怨言,都千万不要表现出来,尤其要避免对公司本身主管的批评,避免面试官的负面情绪及印象;建议此时最好的回答方式是将问题归咎在自己身上,例如觉得工作没有学习发展的空间,自己想在面试工作的相关产业中多加学习,或是前一份工作与自己的生涯规划不合等等,回答的答案最好是积极正面的。

      (7)选择这份工作的原因为何?

      这是面试官用来测试应聘者对工作理解度的问题,藉以了解求职者只是基于对工作的憧憬或是确实的兴趣来应征这份工作,此时之前所强调的事先研究功夫又再度派上用场,建议你的回答应以个人的兴趣配合工作内容特质,表现出高度的诚意,这样才可以为自己铺下迈向成功之路。

      (8)你认为相关产业的发展为何?

      这也是事前准备的功夫,多阅读一些相关的报章杂志,做一些思考,表现出自己对此相关产业的的认识,如果是同业转职者,可强调以自己的经验为基础所做的个人见解,但若是初次接触此一行业,建议采取较为保守的方式,以目前资讯所提供的资料为主作答,表现出高度兴趣及诚意为最高指导原则。

      (9)你希望的待遇为多少?

      这是一个非常敏感的问题,其实在目前,一般大型企业在招聘时就会事先说明基本底薪等等薪资待遇为何,而一般中小型企业有许多仍以个人能力,面试评价做作为议薪的标准,所以建议求职者可以利用现在网络科技查询薪资定位的相关资料,配合个人的价值观,经验,能力等等条件,做出最基本的薪资底限,这时建议无工作经验者应采取保守的态度为准,以客观资料作为最主要考量重点,“依公司规定”的回答是不被建议的,这样不但表示出自己对于工作的自信程度不高,在薪资无法符合个人要求时更会造成许多困扰。

      (10)在工作中学习到了些什么?

      这是针对转职者提出的问题,建议此时可以配合面试工作的特点作为主要依据来回答,如业务工作需要与人沟通,便可举出之前工作与人沟通的例子,经历了哪些困难,学习到哪些经验,把握这些要点做陈述,就可以轻易过关了

  • 测试的招聘与面试!『转载』

    2007-9-12

    摘自 http://www.51testing.com/?121932/action_viewspace_itemid_20477.html

    最近工作一直很忙,也很累,正如那句话说的“疲惫的身体,疲惫的心”。但是那么累,我却过的是那么的开心。前两天在测试时代上看到一些测试的招聘信息,突然让我回忆起测试同行问过我关于测试的招聘与面试怎么知道是真是假,面对多家招聘公司的选择,怎么去判断自己的选择是正确的呢?今天突发奇想,觉的可以记录一些东西,因此便有了这个随笔

     

    今天记录下面两个问题的分析

    1、  怎么从招聘信息分析公司对测试这个职位的了解?

    2、  怎么知道所面试的公司是否适合自己?

     

    从招聘测试的招聘信息和面谈可以了解招聘公司对测试工作的理解和态度 .

    分析点 :

    1)      如果招聘信息要求应聘者了解一些开发流程、测试流程、测试技术(如黑盒测试、白盒测试等等),可见这个公司了解测试这个工作岗位。

    2)      在上面第一条的基础上,如果招聘信息要求应聘者熟悉测试工具的使用,可见这个公司在使用自动化技术或者有这个打算。

    3)      如果招聘信息要求应聘者要有很好的沟通能力、表达能力、协调能力、适应能力、学习能力,可见这个公司的企业文化比较人文化(大家可以互相交流意见)。

    4)      如果招聘信息详细描述包含了两部分:岗位名称和岗位职责,并且招聘信息描述正确、排版美观,说明简洁明了,可见这个公司人事管理规范。


    面谈的时候,招聘公司是否重视测试、懂的测试这个职位,从这下面这几个方面就可以有些了解:

    NO1 :测试的领导是否做过测试工作。

    很多公司管理者的技术能力是在程序员的时代得到的,这些人走上管理岗位后,如果没有持续的学习,就会根本不了解测试是怎么回事,有什么价值,在他们心目中,只有开发人员做的事情才是重要的,可见的。他们之所以招人做测试是因为软件的质量实在太差,客户的不满让他们无法忍受。面对测试狗屁不通的测试经理或者高级经理做测试工作,后果是:首先,努力得不到肯定,工作成果得不到尊重。接着,会发现成长的机会很少,因为领导既然不懂测试,也就不知道需要提高什么样的技能,既不要求你,也不支持你。你只好自己学习,而且难以获得支持和肯定。

     

    NO2 :测试的管理是否规范

    招聘单位是否重视软件质量,从对待开发、测试的管理、执行是否规范就可以看出。测试在整个项目的介入、测试工作的评审,测试报告、对待严重 bug 的处理;对测试人员的考核、工作职责定位是否合理等等就可以了解这个公司测试大体执行情况。

     

    NO3 :知己知彼

    看看自己目前的能力是否能胜任所应聘的岗位,看看公司的企业文化、办公环境是否能适应,看看公司的福利待遇是否能接受了。正如 testage 论坛上关河发起的讨论“ 测试工程师希望什么样的工作环境?”嘿嘿,我的回答是:

    嘿嘿,对于目前的我来说,我希望在下面这样条件的公司做测试工作:

    1 、公司的开发流程是按照正规流程走:需求分析 -- 概要设计 -- 详细设计 -- 单元测试 -- 集成测试 -- 系统测试 -- 验收测试,并对每一阶段的成果物进行有效的评审。因为:把时间花在做正确的事情上才是正确有效的工作方式。

    2 、公司要重视软件的质量,测试可以参与到开发的整个活动过程,进行软件开发全过程测试。因为:测试对软件开发的过程、进度,对所测试软件产生的原因(即用户需求)以及使用的场景了解(即用户为什么要这么做)越清晰,测试的工作才能是准确、有效和高效的。

    3 、公司要有懂的测试工作、理解测试工作的人,特别是测试、开发的领导者。因为:对牛弹琴,牛到死了都不知道你是在干嘛,琴弹的在好都没有办法领悟和理解。

    4 、公司有学习氛围、有良好的沟通环境,大家可以互相的交流自己的思想、经验和对工作成果的意见。因为:有些工作,经过交流会得出新的、更好、更合理有效的处理方法。开发人员和测试人员有效、友好的沟通工作建议和经验会使整个团队的研发水平、测试水平、工作效率、工作质量向上发展。

    5 、公司对测试人员的绩效考核是正确合理的,既不能用其它工种(如:开发人员、技术支持人员)的绩效考核方式来考核测试人员的工作,绩效考核的目的是激励员工工作的积极性。

    6 、公司能够长期生存,公司领导能够规划好整个公司的发展方向、测试部门领导能够很好的规划部门的发展方向。

    7 、公司的生意好好的,能接很多的项目进行研发。

  • C#对Java

    2007-9-08

     

     

    C#对Java

    • 作者:佚名    来源:不详    

    华山论剑:C#对Java
    (仙人掌工作室 2001年06月29日 17:01)

    C#(C-Sharp)是Microsoft的新编程语言,被誉为“C/C++家族中第一种面向组件的语言”。然而,不管它自己宣称的是什么,许多人认为C#更像是Java的一种克隆,或者是Microsoft用来替代Java的产品。事实是否是这样的呢?

      本文的比较结果表明,C#不止是Java的同胞那么简单。如果你是一个Java开发者,想要学习C#或者了解更多有关C#的知识,那么本文就是你必须把最初10分钟投入于其中的所在。

    一、C#、C++和Java

    C#的语言规范由Microsoft的Anders Hejlsberg与Scott Wiltamuth编写。在当前Microsoft天花乱坠的宣传中,对C#和C++、Java作一番比较总是很有趣的。考虑到当前IT媒体的舆论倾向,如果你早就知道C#更接近Java而不是C++,事情也不值得大惊小怪。对于刚刚加入这场讨论的读者,下面的表1让你自己作出判断。显然,结论应该是:Java和C#虽然不是孪生子,但C#最主要的特色却更接近Java而不是C++。

    表1:比较C#、C++和Java最重要的功能
    功能 C# C++ Java
    继承 允许继承单个类,允许实现多个接口 允许从多个类继承 允许继承单个类,允许实现多个接口
    接口实现 通过“interface”关键词 通过抽象类 通过“interface”关键词
    内存管理 由运行时环境管理,使用垃圾收集器 需要手工管理 由运行时环境管理,使用垃圾收集器
    指针 支持,但只在很少使用的非安全模式下才支持。通常以引用取代指针 支持,一种很常用的功能。 完全不支持。代之以引用。
    源代码编译后的形式 .NET中间语言(IL) 可执行代码 字节码
    单一的公共基类
    异常处理 异常处理 返回错误 异常处理。

    了解表1总结的重要语言功能之后,请继续往下阅读,了解C#和Java的一些重要区别。

    二、语言规范的比较

    2.1、简单数据类型

    简单数据类型(Primitive)在C#中称为值类型,C#预定义的简单数据类型比Java多。例如,C#有unit,即无符号整数。表2列出了所有C#的预定义数据类型:

    表2:C#中的值类型
    类型 说明
    object 所有类型的最终极的基类
    string 字符串类型;字符串是一个Unicode字符的序列
    sbyte 8位带符号整数
    short 16位带符号整数
    int 32位带符号整数
    long 64位带符号整数
    byte 8位无符号整数
    ushort 16位无符号整数
    uint 32位无符号整数
    ulong 64位无符号整数
    float 单精度浮点数类型
    double 双精度浮点数类型
    bool 布尔类型;bool值或者是true,或者是false
    char 字符类型;一个char值即是一个Unicode字符
    decimal 有28位有效数字的高精度小数类型

    2.2、常量

    忘掉Java中的static final修饰符。在C#中,常量可以用const关键词声明。

    public const int x = 55;

    此外,C#的设计者还增加了readonly关键词。如果编译器编译时未能确定常量值,你可以使用readonly关键词。readonly域只能通过初始化器或类的构造函数设置。

    2.3、公用类的入口点

    在Java中,公用类的入口点是一个名为main的公用静态方法。main方法的参数是String对象数组,它没有返回值。在C#中,main方法变成了公用静态方法Main(大写的M),Main方法的参数也是一个String对象数组,而且也没有返回值,如下面的原型声明所示:

    public static void Main(String[] args)

    但是,C#的Main方法不局限于此。如果不向Main方法传递任何参数,你可以使用上述Main方法的一个重载版本,即不带参数列表的版本。也就是说,下面的Main方法也是一个合法的入口点:

    public static void Main()

    另外,如果你认为有必要的话,Main方法还可以返回一个int。例如,下面代码中的Main方法返回1:

    using System;
    public class Hello {
    public static int Main() {
    Console.WriteLine("Done");
    return 1;
    }
    }

    与此相对,在Java中重载main方法是不合法的。

    2.4、switch语句

    在Java中,switch语句只能处理整数。但C#中的switch语句不同,它还能够处理字符变量。请考虑下面用switch语句处理字符串变量的C#代码:

    using System;
    public class Hello {
    public static void Main(String[] args) {
    switch (args[0]) {
    case "老板":
    Console.WriteLine("早上好!我们随时准备为您效劳!");
    break;
    case "雇员":
    Console.WriteLine("早上好!你可以开始工作了!");
    break;
    default:
    Console.WriteLine("早上好!祝你好运!");
    break;
    }
    }
    }

    与Java中的switch不同,C#的switch语句要求每一个case块或者在块的末尾提供一个break语句,或者用goto转到switch内的其他case标签。

    2.5、foreach语句

    foreach语句枚举集合中的各个元素,为集合中的每一个元素执行一次代码块。请参见下面的例子。

    using System;
    public class Hello {
    public static void Main(String[] args) {
    foreach (String arg in args)
    Console.WriteLine(arg);
    }
    }

    如果在运行这个执行文件的时候指定了参数,比如“Hello Peter Kevin Richard”,则程序的输出将是下面几行文字:

    Peter
    Kevin
    Richard

    2.6、C#没有>>>移位操作符

    C#支持uint和ulong之类的无符号变量类型。因此,在C#中,右移操作符(即“>>”)对于无符号变量类型和带符号变量类型(比如int和long)的处理方式不同。右移uint和ulong丢弃低位并把空出的高位设置为零;但对于int和long类型的变量,“>>”操作符丢弃低位,同时,只有当变量值是正数时,“>>”才把空出的高位设置成零;如果“>>”操作的是一个负数,空出的高位被设置成为1。

    Java中不存在无符号的变量类型。因此,我们用“>>>”操作符在右移时引入负号位;否则,使用“>>”操作符。

    2.7、goto关键词

    Java不用goto关键词。在C#中,goto允许你转到指定的标签。不过,C#以特别谨慎的态度对待goto,比如它不允许goto转入到语句块的内部。在Java中,你可以用带标签的语句加上break或continue取代C#中的goto。

    2.8、声明数组

    在Java中,数组的声明方法非常灵活,实际上有许多种声明方法都属于合法的方法。例如,下面的几行代码是等价的:

    int[] x = { 0, 1, 2, 3 };
    int x[] = { 0, 1, 2, 3 };

    但在C#中,只有第一行代码合法,[]不能放到变量名字之后。

    2.9、包

    在C#中,包(Package)被称为名称空间。把名称空间引入C#程序的关键词是“using”。例如,“using System;”这个语句引入了System名称空间

    然而,与Java不同的是,C#允许为名称空间或者名称空间中的类指定别名:

    using TheConsole = System.Console;
    public class Hello {
    public static void Main() {
    TheConsole.WriteLine("使用别名");
    }
    }

    虽然从概念上看,Java的包类似于.NET的名称空间。然而,两者的实现方式不同。在Java中,包的名字同时也是实际存在的实体,它决定了放置.java文件的目录结构。在C#中,物理的包和逻辑的名称之间是完全分离的,也就是说,名称空间的名字不会对物理的打包方式产生任何影响。在C#中,每一个源代码文件可以从属于多个名称空间,而且它可以容纳多个公共类。

    .NET中包的实体称为程序集(Assembly)。每一个程序集包含一个manifest结构。manifest列举程序集所包含的文件,控制哪些类型和资源被显露到程序集之外,并把对这些类型和资源的引用映射到包含这些类型与资源的文件。程序集是自包含的,一个程序集可以放置到单一的文件之内,也可以分割成多个文件。.NET的这种封装机制解决了DLL文件所面临的问题,即臭名昭著的DLL Hell问题。

    2.10、默认包

    在Java中,java.lang包是默认的包,它无需显式导入就已经自动包含。例如,要把一些文本输出到控制台,你可以使用下面的代码:

    System.out.println("Hello world from Java");

    C#中不存在默认的包。如果要向控制台输出文本,你使用System名称空间Console对象的WriteLine方法。但是,你必须显式导入所有的类。代码如下:

    using System;
    public class Hello {
    public static void Main() {
    Console.WriteLine("Hello world from C#");
    }
    }

    2.11、面向对象

    Java和C#都是完全面向对象的语言。在面向对象编程的三大原则方面,这两种语言接近得不能再接近。

    • 继承:这两种语言都支持类的单一继承,但类可以实现多个接口。所有类都从一个公共的基类继承。
    • 封装与可见性:无论是在Java还是C#中,你都可以决定类成员是否可见。除了C#的internal访问修饰符之外,两者的可见性机制非常相似。
    • 多态性:Java和C#都支持某些形式的多态性机制,且两者实现方法非常类似。

    2.12、可访问性

    类的每个成员都有特定类型的可访问性。C#中的访问修饰符与Java中的基本对应,但多出了一个internal。简而言之,C#有5种类型的可访问性,如下所示:

    • public:成员可以从任何代码访问。
    • protected:成员只能从派生类访问。
    • internal:成员只能从同一程序集的内部访问。
    • protected internal:成员只能从同一程序集内的派生类访问。
    • private:成员只能在当前类的内部访问。

    2.13、派生类

    在Java中,我们用关键词“extends”实现继承。C#采用了C++的类派生语法。例如,下面的代码显示了如何派生父类Control从而创建出新类Button:

    public class Button: Control { . . }

    2.14、最终类

    由于C#中不存在final关键词,如果想要某个类不再被派生,你可以使用sealed关键词,如下例所示:

    sealed class FinalClass { . . }

    2.15、接口

    接口这个概念在C#和Java中非常相似。接口的关键词是interface,一个接口可以扩展一个或者多个其他接口。按照惯例,接口的名字以大写字母“I”开头。下面的代码是C#接口的一个例子,它与Java中的接口完全一样:

    interface IShape { void Draw(); }

    扩展接口的语法与扩展类的语法一样。例如,下例的IRectangularShape接口扩展IShape接口(即,从IShape接口派生出IRectangularShape接口)。

    interface IRectangularShape: IShape { int GetWidth(); }

    如果你从两个或者两个以上的接口派生,父接口的名字列表用逗号分隔,如下面的代码所示:

    interface INewInterface: IParent1, IParent2 { }

    然而,与Java不同,C#中的接口不能包含域(Field)。

    另外还要注意,在C#中,接口内的所有方法默认都是公用方法。在Java中,方法声明可以带有public修饰符(即使这并非必要),但在C#中,显式为接口的方法指定public修饰符是非法的。例如,下面的C#接口将产生一个编译错误。

    interface IShape { public void Draw(); }

    2.16、is和as操作符

    C#中的is操作符与Java中的instanceof操作符一样,两者都可以用来测试某个对象的实例是否属于特定的类型。在Java中没有与C#中的as操作符等价的操作符。as操作符与is操作符非常相似,但它更富有“进取心”:如果类型正确的话,as操作符会尝试把被测试的对象引用转换成目标类型;否则,它把变量引用设置成null。

    为正确理解as操作符,首先请考虑下面这个例子中is操作符的运用。这个例子包含一个IShape接口,以及两个实现了IShape接口的类Rectangle和Circle。

    using System;
    interface IShape {
    void draw();
    }
    public class Rectangle: IShape {
    public void draw() {
    }
    public int GetWidth() {
    return 6;
    }
    }
    public class Circle: IShape {
    public void draw() {
    }
    public int GetRadius() {
    return 5;
    }
    }
    public class LetsDraw {
    public static void Main(String[] args) {
    IShape shape = null;
    if (args[0] == "rectangle") {
    shape = new Rectangle();
    }
    else if (args[0] == "circle") {
    shape = new Circle();
    }
    if (shape is Rectangle) {
    Rectangle rectangle = (Rectangle) shape;
    Console.WriteLine("Width : " + rectangle.GetWidth());
    }
    if (shape is Circle) {
    Circle circle = (Circle) shape;
    Console.WriteLine("Radius : " + circle.GetRadius());
    }
    }
    }

    编译好代码之后,用户可以输入“rectangle”或者“circle”作为Main方法的参数。如果用户输入的是“circle”,则shape被实例化成为一个Circle类型的对象;反之,如果用户输入的是“rectangle”,则shape被实例化成为Rectangle类型的对象。随后,程序用is操作符测试shape的变量类型:如果shape是一个矩形,则shape被转换成为Rectangle对象,我们调用它的GetWidth方法;如果shape是一个圆,则shape被转换成为一个Circle对象,我们调用它的GetRadius方法。

    如果使用as操作符,则上述代码可以改成如下形式:

    using System;
    interface IShape {
    void draw();
    }
    public class Rectangle: IShape {
    public void draw() {
    }
    public int GetWidth() {
    return 6;
    }
    }
    public class Circle: IShape {
    public void draw() {
    }
    public int GetRadius() {
    return 5;
    }
    }
    public class LetsDraw {
    public static void Main(String[] args) {
    IShape shape = null;
    if (args[0] == "rectangle") {
    shape = new Rectangle();
    }
    else if (args[0] == "circle") {
    shape = new Circle();
    }
    Rectangle rectangle = shape as Rectangle;
    if (rectangle != null) {
    Console.WriteLine("Width : " + rectangle.GetWidth());
    }
    else {
    Circle circle = shape as Circle;
    if (circle != null)
    Console.WriteLine("Radius : " + circle.GetRadius());
    }

    }
    }

    在上面代码的粗体部分中,我们在没有测试shape对象类型的情况下,就用as操作符把shape转换成Rectangle类型的对象。如果shape正好是一个Rectangle,则shape被转换成为Rectangle类型的对象并保存到rectangle变量,然后我们调用它的GetWidth方法。如果这种转换失败,则我们进行第二次尝试。这一次,shape被转换成为Circle类型的对象并保存到circle变量。如果shape确实是一个Circle对象,则circle现在引用了一个Circle对象,我们调用它的GetRadius方法。

    2.17、库

    C#没有自己的类库。但是,C#共享了.NET的类库。当然,.NET类库也可以用于其他.NET语言,比如VB.NET或者Jscrīpt.NET。值得一提的是StringBuilder类,它是对String类的补充。StringBuilder类与Java的StringBuffer类非常相似。

    2.18、垃圾收集

    C++已经让我们认识到手工管理内存是多么缺乏效率和浪费时间。当你在C++中创建了一个对象,你就必须手工地拆除这个对象。代码越复杂,这个任务也越困难。Java用垃圾收集器来解决这个问题,由垃圾收集器搜集不再使用的对象并释放内存。C#同样采用了这种方法。应该说,如果你也在开发一种新的OOP语言,追随这条道路是一种非常自然的选择。C#仍旧保留了C++的内存手工管理方法,它适合在速度极端重要的场合使用,而在Java中这是不允许的。

    2.19、异常处理

    如果你听说C#使用与Java相似的异常处理机制,你不会为此而惊讶,对吧?在C#中,所有的异常都从一个名为Exception的类派生(听起来很熟悉?)另外,正如在Java中一样,你还有熟悉的try和catch语句。Exception类属于.NET System名称空间的一部分。

    三、Java没有的功能

    C#出生在Java成熟之后,因此,C#拥有一些Java(目前)还没有的绝妙功能也就不足为奇。

    3.1、枚举器

    枚举器即enum类型(Enumerator,或称为计数器),它是一个相关常量的集合。精确地说,enum类型声明为一组相关的符号常量定义了一个类型名字。例如,你可以创建一个名为Fruit(水果)的枚举器,把它作为一个变量值的类型使用,从而把变量可能的取值范围限制为枚举器中出现的值。

    public class Demo {
    public enum Fruit {
    Apple, Banana, Cherry, Durian
    }
    public void Process(Fruit fruit) {
    switch (fruit) {
    case Fruit.Apple:
    ...
    break;
    case Fruit.Banana:
    ...
    break;
    case Fruit.Cherry:
    ...
    break;
    case Fruit.Durian:
    ...
    break;
    }
    }
    }

    在上例的Process方法中,虽然你可以用int作为myVar变量的类型,但是,使用枚举器Fruit之后,变量的取值范围限制到了Applet、Banana、Cherry和Durian这几个值之内。与int相比,enum的可读性更好,自我说明能力更强。

    3.2、结构

    结构(Struct)与类很相似。然而,类是作为一种引用类型在堆中创建,而结构是一种值类型,它存储在栈中或者是嵌入式的。因此,只要谨慎运用,结构要比类快。结构可以实现接口,可以象类一样拥有成员,但结构不支持继承。

    然而,简单地用结构来取代类可能导致惨重损失。这是因为,结构是以值的方式传递,由于这种传递方式要把值复制到新的位置,所以传递一个“肥胖的”结构需要较大的开销。而对于类,传递的时候只需传递它的引用。

    下面是一个结构的例子。注意它与类非常相似,只要把单词“struct”替换成“class”,你就得到了一个类。

    struct Point {
    public int x, y;
    public Point(int x, int y) {
    this.x = x;
    this.y = y;
    }
    }

    3.3、属性

    C#类除了可以拥有域(Field)之外,它还可以拥有属性(Property)。属性是一个与类或对象关联的命名的特征。属性是域的一种自然扩展――两者都是有类型、有名字的类成员。然而,和域不同的是,属性不表示存储位置;相反,属性拥有存取器(accessor),存取器定义了读取或者写入属性值时必须执行的代码。因此,属性提供了一种把动作和读取、写入对象属性值的操作关联起来的机制,而且它们允许属性值通过计算得到。

    在C#中,属性通过属性声明语法定义。属性声明语法的第一部分与域声明很相似,第二部分包括一个set过程和/或一个get过程。例如,在下面的例子中,PropertyDemo类定义了一个Prop属性。

    public class PropertyDemo {
    private string prop;
    public string Prop {
    get {
    return prop;
    }
    set {
    prop = value;
    }
    }
    }

    如果属性既允许读取也允许写入,如PropertyDemo类的Prop属性,则它同时拥有get和set存取过程。当我们读取属性的值时,get存取过程被调用;当我们写入属性值时,set存取过程被调用。在set存取过程中,属性的新值在一个隐含的value参数中给出。

    与读取和写入域的方法一样,属性也可以用同样的语法读取和写入。例如,下面的代码实例化了一个PropertyDemo类,然后写入、读取它的Prop属性。

    PropertyDemo pd = new PropertyDemo();
    pd.Prop = "123"; // set
    string s = pd.Prop; // get

    3.4、以引用方式传递简单数据类型的参数

    在Java中,当你把一个简单数据类型的值作为参数传递给方法时,参数总是以值的方式传递――即,系统将为被调用的方法创建一个参数值的副本。在C#中,你可以用引用的方式传递一个简单数据类型的值。此时,被调用的方法将直接使用传递给它的那个值――也就是说,如果在被调用方法内部修改了参数的值,则原来的变量值也随之改变。

    在C#中以引用方式传递值时,我们使用ref关键词。例如,如果编译并运行下面的代码,你将在控制台上看到输出结果16。注意i值被传递给ProcessNumber之后是如何被改变的。

    using System;
    public class PassByReference {
    public static void Main(String[] args) {
    int i = 8;
    ProcessNumber(ref i);
    Console.WriteLine(i);
    }
    public static void ProcessNumber(ref int j) {
    j = 16;
    }
    }

    C#中还有一个允许以引用方式传递参数的关键词out,它与ref相似。但是,使用out时,作为参数传递的变量在传递之前不必具有已知的值。在上例中,如果整数i在传递给ProcessNumber方法之前没有初始化,则代码将出错。如果用out来取代ref,你就可以传递一个未经初始化的值,如下面这个修改后的例子所示。

    using System;
    public class PassByReference {
    public static void Main(String[] args) {
    int i;
    ProcessNumber(out i);
    Console.WriteLine(i);
    }
    public static void ProcessNumber(out int j) {
    j = 16;
    }
    }

    经过修改之后,虽然i值在传递给ProcessNumber方法之前没有初始化,但PassByReference类能够顺利通过编译。

    3.5、C#保留了指针

    对于那些觉得自己能够恰到好处地运用指针并乐意手工进行内存管理的开发者来说,在C#中,他们仍旧可以用既不安全也不容易使用的“古老的”指针来提高程序的性能。C#提供了支持“不安全”(unsafe)代码的能力,这种代码能够直接操作指针,能够“固定”对象以便临时地阻止垃圾收集器移动对象。无论从开发者还是用户的眼光来看,这种对“不安全”代码的支持其实是一种安全功能。“不安全”的代码必须用unsafe关键词显式地标明,因此开发者不可能在无意之中使用“不安全”的代码。同时,C#编译器又和执行引擎协作,保证了“不安全”的代码不能伪装成为安全代码。

    using System;
    class UsePointer {
    unsafe static void PointerDemo(byte[] arr) {
    .
    .
    }
    }

    C#中的unsafe代码适合在下列情形下使用:当速度极端重要时,或者当对象需要与现有的软件(比如COM对象或者DLL形式的C代码)交互时。

    3.6、代理

    代理(delegate)可以看作C++或者其他语言中的函数指针。然而,与函数指针不同的是,C#中的代理是面向对象的、类型安全的、可靠的。而且,函数指针只能用来引用静态函数,但代理既能够引用静态方法,也能够引用实例方法。代理用来封装可调用方法。你可以在类里面编写方法并在该方法上创建代理,此后这个代理就可以被传递到第二个方法。这样,第二个方法就可以调用第一个方法。

    代理是从公共基类System.Delegate派生的引用类型。定义和使用代理包括三个步骤:声明,创建实例,调用。代理用delegate声明语法声明。例如,一个不需要参数且没有返回值的代理可以用如下代码声明:

    delegate void TheDelegate();

    创建代理实例的语法是:使用new关键词,并引用一个实例或类方法,该方法必须符合代理指定的特征。一旦创建了代理的实例,我们就可以用调用方法的语法调用它。

    3.7、包装和解除包装

    在面向对象的编程语言中,我们通常使用的是对象。但为了提高速度,C#也提供了简单数据类型。因此,C#程序既包含一大堆的对象,又有大量的值。在这种环境下,让这两者协同工作始终是一个不可回避的问题,你必须要有一种让引用和值进行通信的方法。

    在C#以及.NET运行时环境中,这个“通信”问题通过包装(Boxing)和解除包装(Unboxing)解决。包装是一种让值类型看起来象引用类型的处理过程。当一个值类型(简单数据类型)被用于一个要求或者可以使用对象的场合时,包装操作自动进行。包装一个value-type值的步骤包括:分配一个对象实例,然后把value-type值复制到对象实例。

    解除包装所执行的动作与包装相反,它把一个引用类型转换成值类型。解除包装操作的步骤包括:首先检查并确认对象实例确实是给定value-type的一个经过包装的值,然后从对象实例复制出值。

    Java对该问题的处理方式略有不同。Java为每一种简单数据类型提供了一个对应的类封装器。例如,用Integer类封装int类型,用Byte类封装byte类型。

    【结束语】本文为你比较了C#和Java。这两种语言很相似,然而,说C#是Java的克隆或许已经大大地言过其实。面向对象、中间语言这类概念并不是什么新东西。如果你准备设计一种面向对象的新语言,而且它必须在一个受管理的安全环境内运行,你难道不会搞出与C#差不多的东西吗?

Open Toolbar