VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - goto语句的应用
发表评论(0)作者:, 平台:, 阅读:12914, 日期:2000-05-11


- 信区: 学术网-程式设计区 ---

编号: 1567 日期: 08 Jul 99 09:34:15

来自: 老怪 读取: 是 已回信: 否

写给: All 标示:

提要: 用 goto 写程式很糟糕吗 ?

--

_作者:letsgo@ms6.url.com.tw


changyc 撰写于文章 <7lu7ac$do5$1@netnews2.csie.nctu.edu.tw>...

>85 alumni Jye Lu wrote:

>> Class 类别的物件 wrote:

>> > 这跟 goto 无关.. 这是 if, else if 的替代!

>> 如果您有学过组语, 就会知道几乎所有这类的

>> 'branch' 都是 jmp 或 jcc; 只是经由比较高阶

>> 语言的包装之后, 程式设计师比较容易维护.

> ^^^^^^^^^^^^^^^^^^^^^^^

>这就是这一大串讨论的重点丫....

>可读性高是高阶语言的优点之一丫....

>你总不能说反正所有的语言(包括assembly language)都要翻成

>0与1的机器码, 所以各个语言都一样吧?!


原则上是少用 GoTo 这样的叙述,但 GoTo 就算在 VB 这么结构化的语言伫,仍有它特

殊而无法取代的功能,我举个例子来说明。下面是我写的一个 SubProcedure,功能是

检查所有的本机磁碟 ,找到一个已就绪的磁碟机。


Private Sub 搜寻就绪磁碟机()

Dim DiskSerial As Byte

'开启磁碟机错误处理常式 LocalDriveError:

On Error GoTo LocalDriveError


'开始搜寻已准备就绪的磁碟机

StartSearch:


'依 A,B,C,D......序列找一个可以开启的磁碟机

ChDrive Chr(DiskSerial + vbKeyA)

MsgBox Chr(DiskSerial + vbKeyA) & " 磁碟机准备就绪", vbOKOnly

Exit Sub


'磁碟机错误处理常式

LocalDriveError:


Select Case Err.Number

'磁碟机未装置就绪错误

Case 68

'用把 DiskSerial 加一的方式指向下一台磁碟机装置

DiskSerial = DiskSerial + 1

'跳回原来[开始搜寻已准备就绪的磁碟机]的行号

Resume StartSearch

Case Else

MsgBox Err.Description, vbOKOnly, "错误代码:" & Err.Number

End Select

End Sub


这式子有两处行号跳跃,一个是错误处理行号 LocalDriveError:,一个是开始程式动

作行号 StartSearch: ,这么设计的目的是当我依序开启本机磁碟,如果磁碟未就绪,

那就跳到 LocalDriveError 行,把磁碟机序号加一后,跳回 StartSearch 行号,把原

程式段再执行一次。所以用十五行程式我就可以处理完 A~Z 个磁碟机,如果我坚持不

行号跳跃,完全 If...Else...判断,那式子会很复杂。或者我用递回,也就是说在

Case 68 后面,不用 Resume StartSearch,而用 Call 搜寻就绪磁碟机 方式再递回执

行下去,虽然程式码相同,但

1.DiskSerial 这个变数就不能用 Dim 宣告,而要改为 Static。

2.每一个递回都会在 Memory 伫造成一个堆叠,如果 A~Z 个机器的磁碟机,就要有 26

个堆叠的心理准备。

所以如果 GoTo 能让你程式更有效率,甚至更容易阅读,Why Not ?