好久没有写BLOG了,之前出差了2个月,都没怎么看书,也没有太多时间写。回来后一个月人也有点放松。现在开始还是得继续努力啊。不废话了,下面就介绍下Linux系统的分区和挂载

 

 

一 Linux的安装

 

Linux的安装是比较简单的,整个过程和安装XP差不多。首先BIOS中设置从光驱启动,(不知道怎么设置?那你还是先装虚拟机玩玩吧!)会要你选安装模式,直接回车用图形界面;然后Linux安装程序会有一个检查光盘的过程,这里可以选择跳过【Skip】;然后等待初始化工作,系统就可以进入到安装界面了;进入安装界面后就可以进行一些设置(区域,语言,时间,密码,分区等),设置完成后选择要安装的组件,安装完成就一切OK了。

 

 

二 Linux系统分区

 

这里我说的是指在分区时采用手动分区,而不是自动分区。Linux分区和Windows有很大的区别,你无法在Linux中看到诸如Windows中的C盘,D盘。这确实会让我们这些用惯了WIN操作系统的人感到很不习惯。其实理解了Linux分区结构后就很清晰了。

 

1: 硬盘分区

 

首先我们来看硬盘分区,分区是和操作系统没有任何关系的,因为她是在安装操作系统之前进行了。我们可以简单的认识,分区就是把硬盘分割为不同的区域。在谈具体分区前,有个比较简单的问题想问下大家:硬盘问什么要分区?…..哈哈!怎么样,不是很好回答吧,首先是因为操作系统在启动时会通过MBR来获得操作系统文件所在的分区,所以一个可引导分区是不能缺少的。这也是为什么新买的硬盘不能直接用的原因。而且进行多个分区是为了提高管理效率,所有东西放在一个分区,OS管理其起来效率比较低,因为每次要检索的东西太多。

下面我们简单看下硬盘的分区结构:

硬盘主引导扇区 = 硬盘主引导记录(MBR)+ 硬盘分区表(DPT),一共是512个字节,其中MBR是446,分区表一共64字节,然后是2个字节的结束标志。引导扇区存储在硬盘的0头0道1扇区,也就是Boot Sector。(如图1)

操作系统在启动时通过BIOS(BIOS实际是一个基础输入输出系统,用于和硬件打交到)程序把Boot Sector读入内存,然后执行其中MBR,这个时候BIOS就把启动交给MBR控制;MBR作用是在4个分区表中搜索标志为活动的分区,找到后把活动分区的第一个扇区读入内存,然后开始执行它,运行特定系统的启动程序(LILO,GRUB,NT Loader);这个时候启动的启动就交给了操作系统的引导程序来控制了。然后操作系统进行一系列的初始化,最后把系统交给系统内核进行管理。

图 1

 

 

2:分区类型

 

上面介绍了硬盘分区结构和系统启动,下面就看下各个分区。硬盘分区一共有3种,主分区,扩展分区和逻辑分区(如图2)

图 2

 

主分区上可以安装操作系统,因为MBR中记录的主分区信息,系统启动时会到主分区来查找操作系统引导文件,所以操作系统的引导文件必须在主分区中,否则系统就无法启动了。而最多只支持4个主分区(由于硬盘仅仅为分区表保留了64个字节的存储空间,而每个分区的参数占据16个字节,故主引导扇区中总计可以存储4个分区的数据。操作系统只允许存储4个分区的数据。所以为了建立更多的逻辑磁盘供操作系统使用,系统引入了扩展分区的概念)。

 

扩展分区并不是一个真实存在的分区,它只是内存管理链表中的一个指针,指示出那一块区域是扩展分区。上面也提到出现扩展分区的原因。所以一个扩展分区也是一个主分区。而通过在扩展分区中在划分逻辑分区对系统分区进行扩展。实际上所有的逻辑分区都是在一个分区类,只是逻辑上分开,这也是叫逻辑分区的原因。但对用户来说一切都是透明了,我们看起来系统中有很多分区。

 

 

3:Linux分区

 

其面介绍了硬盘分区结构和分区类型,这里就要讲讲Linux系统中分区的表示了。首先回顾下WINDOWS下分区的情况。在WINDOWS系统里,我们看到,每个分区都有一个名字,C,D,E,F….实际这是OS使用的一种映射。通过操作系统中看到的这些盘符和分区联系起来,然后我们就可以在这些盘符下读写文件,操作系统负责把文件写入到硬盘分区。在WINDOWS中盘符名称和分区是对应了。

 

我们在来看看LINUX下的情况,在Linux下使用/dev/hda,hdb..这样来标识硬盘,具体硬盘上的分区就用/dev/hda1,hda2,来表示.最后的数字代表分区号,主分区是1-4,逻辑分区是5以后的数字。Linux中最大的区别就是我们在也看不到所谓的盘符了。Liunx采用树形的文件管理系统,也就是在Linux系统中,可以说已经没有分区的概念了。分区在Linux和其他设备一样都只是一个文件。要使用一个分区必须把它加载到文件系统中。这可能难于理解,继续往下看。

 

Linux中树形的文件结构,最顶层是/ 目录。在安装系统时,你必须选择把一个主分区挂载在/ 目录下,因为系统需要安装在/挂载的主分区下。否则系统会提示你。这里又一次提到了挂载。所以挂载就是把目录和分区连接起来,和上面说的WINDOWS下的映射关系是一样的。不同的是WINDOWS是把分区映射到一个盘符,而LINUX下是映射到一个目录。 这是理解他们不同最重要的地方,而导致不同的是因为文件系统结构不同。

 

 

4:Linux文件系统

 

上面说了Linux的文件系统是树形的,安装的系统必须是在/ 目录下,因为/目录下挂载了一个主分区。/目录是树形的根,其他所有目录都是他的子节点。

 

图 3

 

我们看上图3 可以更好的理解, Linux整个系统结构如上, 我们安装系统的时候已经把分区1挂载到 / 目录下了. 而这个时候没有挂载其他任何分区,所以/ 目录下的所有其他目录都在这个分区下,也就是说,我在任何目录下读写操作实际都是操作的这个1号分区。

 

如果我们想使用其他分区,就必须把这个分区挂载到一个目录下,这个目录可以是已经存在的目录,比如/home,也可以是我们自己建立的目录,比如/oracle。当然有些目录比如/lib, /dev, /etc, /usr这些都不能挂载其他分区,因为他们都存放着系统需要的文件,一旦被挂载其他分区,那没OS就无法找到所需的文件,系统就会崩溃。比如我们把分区2挂载到/usr/X11目录下时,系统就无法通过X11目录找到分区1上的文件,这个时候系统图形界面就无法使用了. 虽然文件还在硬盘上。前面说过,目录 — 分区 是通过挂载吧他们联系起来。你更换了分区,也就破坏了联系,就无法在找到之前的文件了。我们在看分区5和分区6,我们把它挂载到/home/ftp 和 /oracle目录下,这个时候我们在操作这2个目录是,就是操作对用的分区了.

 

而WINDOWS就没这么复杂,她不是采用树形的结构,每个分区对应一个盘符,一旦建立映射关系就无法在修改。实际上,LINUX的每个挂载了分区的目录就相当于WINDOWS系统中的盘符,比如上面的,/home/ftp 和 /oracle目录我们就可以把她看做一个盘符和一个分区关联,只是因为LINUX文件系统,使得她更加灵活,所以也更复杂和难以理解。

 

 

 

三    Linux中的设置

 

1:查看Linux分区信息

 

前面介绍完了Linux文件系统和分区的关系,大家应该对分区有很清楚的认识了。下面我们就关注下Linux系统中如何查看分区情况。

在Linux系统中我们使df -u 命令就可以看到系统目前分区情况

Filesystem            容量      已用      可用        已用%    挂载点
/dev/hda1              21G       6.7G        13G        35%          /
none                     506M       0          506M       0%           /dev/shm
/dev/hda2              11G       5.2G        5.0G       52%         /home
/dev/hda5              16G       9.3G        5.1G       65%         /oracle
/dev/hda6              19G       201M      18G        2%           /usr1

从中我们可以看到目前系统加载了4个分区,其中2个主分区(hda1,hda2)和两个逻辑分区(hda5,hda6)。也可以看到他们的加载点。其中hda1分区是系统分区,上面安装了操作系统。而/home,/orace,/usr1分别加载了其他3个分区。

 

而通过fdisk -l 命令可以看到目前系统中所有分区的信息,如下表

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        2677    21502971   83  Linux
/dev/hda2            2678        4079    11261565   83  Linux
/dev/hda3            4080        9729    45383625    5  Extended
/dev/hda5            4080        6080    16073001   83  Linux
/dev/hda6            6081        8581    20089251   83  Linux
/dev/hda7            8582        9729     9221278+  82  Linux swap

可以看到hda3是一个主分区,但实际上他是一个扩展分区,前面我们介绍了扩展分区,她实际会占用一个主分区,因为MBR只能记录4个分区信息. 由一个比较特殊的是hda7,她是一个交换分区,在WINDOWS系统中就是虚拟内存文件. 所以用df命令是查看不到她的.

这里顺便说下为什么标识为/dev/hda,前面简单提到过,LINUX下所有设备都被认为是文件,而/dev目录存放所有系统设备文件的,而一个分区就是一个文件,名字就是分区的名字.

 

 

2:Linux分区挂载

 

常用的挂载和卸载分区及文件系统的命令是mount和umount ,比如 mount /orace  /dev/hda5,就是把5号分区挂载到/oracle目录下。具体的命令格式就不介绍了,网上很多,也可以使用man来查看。我们这里主要讲讲自动挂载。并经每次都要使用命令手动挂载确实很麻烦,我们可以通过编辑/etc/fstab文件来让系统开机时自动加载(这里介绍的是系统安装好后,使用fdisk分区后,进行加载)

 

vi /etc/fstab 就可以看到一下信息:

# This file is edited by fstab-sync - see 'man fstab-sync' for details
LABEL=/                   /                       ext3      defaults        1 1
none                           /dev/pts            devpts  gid=5,mode=620  0 0
none                           /dev/shm           tmpfs   defaults        0 0
LABEL=/home          /home               ext3    defaults        1 2
none                          /proc                  proc    defaults        0 0
none                          /sys                   sysfs   defaults        0 0
LABEL=/oracle        /oracle                ext3    defaults        1 2
LABEL=/usr1           /usr1                  ext3    defaults        1 2
LABEL=SWAP-hda7         swap     swap    defaults        0 0
/dev/hdc                /media/cdrom            auto    pamconsole,fscontext=system_u:object_r:removable_t,exec,no  auto,managed 0 0

这个文件第一列就是具体的分区,第2列是分区挂载的目录,第3列是文件格式,第4列是挂载规则,第5列是备份;0为从不备份,或显示上次至今备份之天数;第7列是启动时fsck检查顺序,0为不检查, “/”永远为1;

了解了各个字段我们就具体来看下,其中/ 目录系统会自动写到这个文件中,因为不加载系统如何启动??那几个none挂载的我还不太清楚。我们具体看看我们实际分区的挂载。我们可以在linux中使用fdisk 来进行分区。比如我们用fdisk划分了hda2,5,6,7这4个分区。但我们想使用他们的时候,我们必须手动添加。

 

我们可以通过一下命令来完成自动加载

mkfs.ext3 /dev/hdax
e2lable /dev/hda2  /home  LABEL=/home          /home               ext3    defaults        1 2     //修改Fstab

分区要使用首先要格式化,目前使用较多的是ext3文件格式, 他相对于ext2更安全,更快,但是比较浪费空间了,我80G硬盘用ext3后,可用的只有67G左右,XP下 NTFS和FAT32可是有70G左右的.格式话之后就可以给分区设置一个标签名(一般和要挂载的目录名字相同),然后在fstab文件中添加一行。大家可能有疑问,第一列不是标识分区吗,这里为什么要用标签,其实你也可以用  /dev/hda5 ,这里LABLE是一个分区的标签,你可以把它当作分区的名字。

以上就是对一个新建分区自动加载的过程。开机后我们可以通过 vi /etc/mtab查看已经加载的分区和文件系统。

 

 

3:关于交换分区

 

目前计算机内存越来越大,LINUX和VISTA都使用了内存做缓存,cached和buffers的区别在于一个是读一个是写。目前系统最大的开销都是I/O操作,通过buffers先把文件读到内存,这样就减少了I/O,而使用cached就是把要写入的文件放到缓存中,操作系统一次写入磁盘,减少I/O。而交换分区是为了解决内存不足,而目前交换分区使用的很少,所以不需要给她分配过大的空间。当然作为小内存机器还是很有用。

我们可以单独划分一个分区作为交换分区,比如我们使用前门的hda7作为交换分区。因为他是交换分区,所以文件系统不能是ext3格式,必须是交换分区格式.

mkswap -v1 -L SWAP-hda7 /dev/hda7
swapon -a
LABEL=SWAP-hda7     swap       swap    defaults        0 0    //修改Fstab

用以上的mkswap命令就可以把一个分区格式化为交换分区文件系统,其中-L 参数是设置分区的LABLE名。然后使用swapon -a来关在系统中所有交换分区。最后修改fstab,加入这一句, 开机就可以自动加载交换分区了。

 

 

4:加载其他文件系统

 

除了加载Linux系统分区以外,我们还可以加载光驱,软驱,USB存储设备,设置是WINDOWS文件系统。方法和上面完全一样,这里就不废话了。最后要注意的是修改fstab要注意,如果设置的不正确,可能导致系统无法启动.所以编辑时要小心.

 

 

 

参考资料:

 

Linux系统引导过程及硬盘分区结构论述

 

最近在测试B/S系统,但是一直对JAVA的系统不是很了解,特别是J2EE下一些开发模式,一些中间件,容器,WEB服务器,EJB,javebean这些。感觉比较混乱。整理下相关的概念。

实际J2EE平台上这些概念,都是为了实现程序的分层而提出的。程序分层的好处这里就不在去讨论了。主要的目的也就是解藕,提高程序的重用性,使得程序各层分工明确,不相互影响。

上面是一个J2EE的结构图,分了3个部分,客户层,J2EE服务器,企业信息系统。这3层并不是我们常说的3层结构,我门常说的主要是针对J2EE体系,也就是服务器这一块的。比如其中的表示层,业务逻辑层和数据层。

继续阅读

这一篇主要介绍委托的一些内部结构,想要了解委托的使用和功能可以看前一篇文章:.NET学习笔记(八) ——委托(上)

前天不小心感冒了,吃了药但还是晕晕的,还是继续写把。。。前面介绍了委托的功能和使用方法。委托实际是对一个函数指针的封装,那么他是如何指向一个函数,有是如何把多个方法都绑定起来的呢?

 

一 委托的内部结构

 

下面是简单的一个定义委托方法,写起来很简单,当编译器编译这句话的时候做了什么呢?

//申明一个委托要绑定的方法签名
public deletgate void ExampleDeletgate(int x);

通过ILDASM我们可以看到,系统产生了以下代码:

//构造器有2个参数为了方便后面使用,我重新定义这2个变量名字
//public ExamplDelegate(object target,int methodPtr)
.method public hidebysig specialname rtspecialname  
       instance void  .ctor(object 'object', native int 'method') runtime managed
{
}

//下面两个是委托的一个异步回调用方法,我们暂时不关注他们
.method public hidebysig newslot virtual 
        instance class [mscorlib]System.IAsyncResult 
        BeginInvoke(int32 x,class [mscorlib]System.AsyncCallback callback,object 'object') runtime managed
{
}

.method public hidebysig newslot virtual 
        instance void  EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed
{
}

//这个方法和委托指定的方法原形是一样的,我同样改写下
//public void virtual Invoke(int32 x);
.method public hidebysig virtual instance void Invoke(int32 x) runtime managed
{
}

继续阅读

过年后就一直没写学习笔记了,书第一边已经看完了,后面从事件开始的章节有些复杂,牵扯的知识也很 多。而且最近工作也很忙,所以没有时间来写。这段时间感觉自己对委托又有了一定的认识,所以打算来聊聊 .net里的委托。

 

一 什么是委托

 

MSDN中给出的定义:

委托是用来处理其他语言(如 C++、Pascal 和 Modula)需用函数指针来处理的情况的。不过与 C++ 函数 指针不同,委托是完全面对对象的;另外,C++ 指针仅指向成员函数,而委托同时封装了对象实例和方法。

简单的说委托就是对函数指针的一个封装。所谓的函数指针,了解C++的人都应该知道,函数指针中存放的 是函数的地址,当调用是,使用这个指针就可以调用到函数。而委托只不过是给这个指针穿的件漂亮的衣服, 使他变的更安全更强大。

delegate 声明定义一种引用类型,该类型可用于将方法用特定的签名封装。委托实例 封装静态方法或实例方法。委托大致类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。

delegate  void  DeletgateEx (int x);  //声名一个委托

DeletgateEx dx =new dx(print);   //实例化一个委托并绑定一个方法  

void print (int x)
{
  Console.WriteLine(x.ToString());
}

delegate 是声明委托的关键字

  1. 定义一个委托类型,这看起来有点奇怪,和一般的定义不一样?好象是在声明一个方法。要注意,委托 是对函数指针的封装,所以你就把委托看成一个存放函数的对象。但是委托不是任何函数都可以存放,他只能 存放和他声明的函数拥有相同签名的函数。从例子可以看出,这个委托只能存放一个没有返回值,有一个int 形参数的方法。
  2. 实例化这个委托,和其他引用对象一样,使用new创建。它需要一个参数,那就是要与此委托绑定的方法。
  3. 任何与委托的签名相同的方法,都可以绑定到他上面。(具 体怎么绑定后面介绍)

继续阅读

昨天写完了,然后点发表,竟然什么都没了,真是惆怅啊。难道是长时间没响应?之前好象不会把今天重写把。

最近因为在公司因为搞性能测试的没什么人了,我也就逐渐转向性能测试方面的学习了。学习了大概有3个星期了,也用了LR跑了一些场景,不过觉得首先还是要把一些基本概念理解清楚,所以就把一些基本的东西写下来。让自己加深理解。也希望帮助大家了解一些。

 

 

一. 软件性能测试

 

在我们学习性能测试之前,首先要明白什么是性能。汽车有他的性能,比如速度,加速时间,稳定性;电脑硬件有他的性能,比如CPU的频率,处理的速度,游戏的性能。而计算机软件也有他的性能,比如软件运行速度如何,系统稳定性如何等等。性能的好坏不能凭空想象。必须有一些数据来说明来比较。所以我们软件性能测试就是通过得到软件在各种运行情况下的数据来进行分析,来判断软件的性能。一个软件对于不同的人群,他所关注的性能方面是不一样的。比如对于用户来说,他关心的是程序响应的时间,也就是他点一个提交按钮,多长时间可以得到结果。而对于系统管理员他关注的可能是软件在运行时,对系统资源的使用情况,在大量用户使用时的表现如何,能否长时间稳定的工作;而对于开发人员,他们更关心的是系统结构是否合理,SQL执行速度是否够快,有没有内存泄漏等情况。而对于我们测试人员来说,我们需要站在多个 角度来关心性能问题。

 

 

二 性能测试主要术语

 

1:响应时间:

 

响应时间的定义是:对请求作出响应所需要的时间。我们一般把响应时间作为用户角度衡量软件性能的主要指标。

毕竟系统是给用户使用的,用户对系统性能是否满意是用户说了算的。一般情况下响应时间是分为多个步骤的,首先从客户端发出请求,经过网络达到服务器N1,应用服务器处处理S1,访问数据库服务器N2,数据库服务器处理时间为D1,然后返回给应用服务器的网络时间为N3,应用服务器处理时间S2,在传个客户端的网络时间是N4。那么整个响应时间应该为T=N1+S1+N2+D1+N3+S2+N4,当然如果还用到其他服务器,还要加上其他时间。而实际上,除开这T,还有一个客户端的显示时间也要可以算做响应时间。所以时间Tx = T +Ts。但实际上Ts很大程度上是由用户的机器决定的,所以我们一般只关注T,所以通常把T称做响应时间。

一般一个网站,被普遍接受的响应时间是2/5/10,就是说2秒内给用户响应是很满意的,5秒是可以接受,而我一般是等不到10秒就会ALT+F4了!但不同的软件,响应时间的标准要根据实际情况来定。比如一个数据库备分软件,你能要求他5秒内搞定一个1G的数据库吗?

 

继续阅读

工作也快1年了,却一直没有写过一篇关于测试方面的文章。一直做功能测试,功能测试这个东西,也有他的一套理论,一套流程,以及测试过程中的一些方法,什么边界法,等价类。但实际工作中,因为真正把测试流程走的很好的公司毕竟很少。所以编写测试计划,写完整的测试用列,运用这些方法可能机会不多。而实际工作中,完全的功能测试重要的就是理解业务和需求。所以具体的什么流程就不说了,网上资料很多。

 

下面谈谈自己对功能测试的一点看法:

 

需求理解了,知道客户想要系统实现什么,理解了业务,就知道了系统是怎样一个流程来实现的。然后按照需求来进行测试的,不满足需求要求的都可以认为是BUG。但实际中,这样一个简化了过程都很难,毕竟想从开发那拿到一份完整详细的需求都是很不容易的(当然,可能也有比较规范的公司,但目前大多数应该是这个情况)。

 

当然功能测试也不是真的那么简单,要做好一个功能测试,前提是要对需求比较熟悉,各个业务细节都很了解。甚至做到比开发人员还要了解。这或许是测试人员唯一的优势了。个人做了快1年功能测试的一点看法。要做好功能测试,还需要对整个业务中数据库的操作比较清楚(针对信息管理相关的系统)。比如哪个业务需要用到那些表,做怎么样的操作。了解了这个就可以不单单从程序前台来看程序,看到数据库的过程,更有利于你找到隐藏的BUG。比如库表没有进行关联删除,日志表没有插如记录。这些是从前台看不出来的,但实际可能会导致程序出现问题。

继续阅读

和往常一样,开篇还是介绍下最近情况了。今天是农历12月24,我们那边今天是过小年。总算是进了年关了,也给大家摆个早年了。不过最近火车成了大问题,能不能顺利回家还是个问题。自己也没啥心情看书了。哎~~还是不能堕落了。而且住的附近无线网用不了了,很久没有写了。书到是看到最后几章了。不过越到后面就越觉得有些复杂了。特别是有些地方以前很少接触用的也少,比如特性 ,枚举,字符的本地化这些。而且目前有好多笔记没写。所以决定用的不多的和很复杂的地方暂时就不去深研了。毕竟是第一轮学习。所以就把实际用的比较多的拿出来写下。其他那些就大概的照本宣科好了。

一 字符

(今天来做个标记,免得说好长时间没写了,哈哈~~)

事件其实也是属于类型设计里的内容,不过因为他比较重要,也比较难理解,我就把他单独拿出来学习。

 

1 .下面是一个我们在程序中最常见的代码

 

private void button1_Click(object sender, System.EventArgs e)
 {
          //按妞被点击后执行的操作;    
 }

他的意思是当你点击一个按钮时,他就会执行这个方法里的代码,产生相应的操作。这个时候我们就可以说‘单击’button1这个事件发生的时候,他会自动去执行这个方法。这看起来很简单。点一个按钮,然后执行代码。这在这种基于驱动的程序中很常见。但有个问题不知道大家有没有想过。

这段代码写在那?一般是写在一个from类里,我点这个按钮属于button类。我实际实在button对象里调用了form对象里的方法。那为什么在点按钮的时候他会执行这个方法呢?

说简单点,就是其实就是在一个对象在执行一个方法时调用其他对象的方法。按事件来说就是一个对象的某个事件被触发时,通知其他对象,其他对象执行相应的一些操作。这里就是button的click事件触发后,通知form对象,执行button1_click()方法。那么当事件触发后是如何通知其他对象的呢?

// button1
// 登记方法到button对象
this.button1.Click += new System.EventHandler(this.button1_Click);

在程序中可以看到button1在设置时有这样一句话,他的基本意思就是把button1_click()方法登记到button1.Click对事件象上,这样当触发click事件时就会调用button1_click()方法。也就达到了通知的目的。其中button1.Click又是一个EventHandler类型,这是一个委托类型!什么是委托类型?

继续阅读

好久没有写BLOG了,BLOG一直有点问题。最近一段时间也有点堕落,书看的不多,上个月底 一直在看关于 类之间的继承,多态 。虚方法的继承,隐藏,重写,方法表,内存结构等。还在CSDN上看了不少帖子。这些东西有空还是会总结一下的。

新年了,希望有新的气象。有好多事都会有大的变化。目标,计划都有了,需要的就是自己不断的坚持,好好努力,按自己的路线走下 去。也祝大家新年快乐把。

———————————————————————————————————————————–

(接上篇)

疑问:基元类型为什么不和Decimal一样提供ToXXX()方法呢?他内部是否实现了这些方法?

解答:通过用Reflector,我看了下他们

 

1. Int32里是类似下面的方法,可以发现实际是调用了Convert.ToInt16里的实现 并且是受保护的方法。内部也没有转换操作符 。
short   IConvertible.ToInt16 (IFormatProvider   provider) 
{ 
        return   Convert.ToInt16(this.m_value); 
} 
2. decimal里面也与这样的受保护的实现方法
short   IConvertible.ToInt16 (IFormatProvider   provider) 
{ 
        return   Convert.ToInt16(this); 
} 

继续阅读

这段时间工作有点忙,系统刚上线,也有点累。这段时间主要看到了书中.net类型设计这一部分,这一部分主要介绍的是如何用不同的成员来设计一个类型。

 

一 类型成员介绍

 

面向对象的语言中,最重要的一个特点就是封装,说到最多的一个词就是类。什么是类,类是定义同一类所有对象的变量和方法的蓝图或原型。让数据同操作分离开。人类是一个类,而我们每个人就是这个类的一个实例,也就这个类的一个对象。 我们这里说的类型,并不是程序中的类Class,因为我们知道了类型有,值类型,引用类型。这里用类Class主要是帮助大家理解,毕竟它是用的最多。一个类型,他可以包括以下一个或多个成员:

 

  • 常数:常数是一个表示恒定不变的数值符号。常数 总是和类型而非他们实例相关联,所以他们可以说总是静态的。
  • 字段:字段表示一个数据的值,他可以是只读的,也可以是可读写的。字段分为动态字段和实例字段。一般字段声名为私有,这也是面向对象中推荐的作法,防止字段被随意操作。也就是我们类中定义的数据成员。
  • 方法:方法是一个函数,用来改变或查询一个类型,或者一个对象的状态。也就是我们类中定义的成员函数。
  • 属性:属性也是一种方法,当他比较特殊,他主要是用来设置和保护类中的数据成员。
  • 事件:用通俗的话来说,就是你操作某个对象时,执行的某一个方法。他只在特定的时间,由指定的对象来执行指定的方法。

除了上面介绍的这些,一个类型中还包括,构造器(类型初始化用),重载操作符,转换操作符等。对于一个类型,内部可以嵌套定义其他类型。这可以使得复杂的类型划分为小的代码块,简化实现。下面是类型成员的限定修符的解释:

继续阅读