VB考试教程:过程的使用之过程参数传递

文章作者 100test 发表时间 2007:04:06 21:08:45
来源 100Test.Com百考试题网


2、过程参数传递

过程通常需要某些程序当前状态的信息才能完成它的工作。程序当前状态信息也包含在调用过程时传递到过程内的变量。当将变量传递到过程时(完成形式参数与实际参数的结合),称变量为参数。

(1)参数的数据类型

过程的参数类型缺省为Variant数据类型。不过,也可以声明参数为其它数据类型。例如:函数接受一个字符串变量和一个整型变量:

Function WhatForLunch(WeekDay As String,Hour As Integer) As String

If WeekDay="Saturday" then
WhatForLunch="Fish"
ELse
WhatForLunch="Chicken"
End If
If Hour>2 Then WhatForLunch="Sorry,Its too late!"

End Function

(2)按地址传递参数

按地址传递参数过程(也称“引用”)使得过程通过变量的内存地址去访问实际变量的内容。将变量传递给过程时,在过程中可改变变量的值。按地址传递参数在VB中是缺省的。

如果给按地址传递的参数指定数据类型,就必须将这种类型的值传递给参数,也可以给参数传递一个表达式,VB计算表达式,并按要求的类型将值传递给参数。

当变量通过地址传递时,对变量的任何修改都被传递给调用过程。传址参数调用在修改调用过程中的变量方面具有显著的优点,只是不要在过程中无意地修改变量。

例如,下面的子过程声明和调用:

Sub CostPlusInterest(Cost,Total)

Cost=Cost*1.05 add 5% to Cost
Total=Int(Cost) then make integer and return

End Sub

调用:

……

 Price=100
Total=0
Costplusinterest Price,Total
Print Price. "at 5% interest is ".Total

本例中,程序将两个传址变量传递给CostPlusInterest过程:Price和Total。程序员计划在随后的Print方法中使用更新的Total变量,但不慎忘掉了Price变量在过程的中间步骤中被更新,所以程序运行时,产生结果如下:

  105 at 5% interest is 105

没有达到预期的效果。

(3)按值传递参数

避免上述问题的一种好的做法是按值传递参数。按值传递参数传递的只是变量的副本。如果过程执行过程中改变了这个值,则所有变动只影响副本而不会影响变量本身。使用ByVal关键字指出参数是按值来传递的。

例如:对上例加以修改,就不会发生上面出现的错误,改动如下:

Sub CostPlusInterest(ByVal Cost,Total)

当使用ByVal声明Cost参数时,就会产生正确的结果:

    100 at 5% interest is 105

如果不想依赖于ByVal关键字,也可以换一种方法防止所传递的变量被修改:将变量置于括弧内而把它转换为文字值,如上例中,调用costplusinterest过程的语句为:

costplusinterest(price),total,

同样可以得到正确结果。

再例如,有下面代码:

Option Explicit

Function Multiply(ByVal n As Integer) As Integer
Multiply = 1
Do While n > 0
Multiply = Multiply * n 求n!
n = n - 1
Loop
End Function

Private Sub Form_Click()
Dim sum As Integer, i As Integer
For i = 5 To 1 Step -1
sum = sum Multiply(i)
Next
Print "sum=". sum
End Sub

运行后结果为153(5! 4! 3! 2! 1!)。

若将函数的参数n前的“ByVal”去掉,结果为120(5!),这显然不是编者的初衷,是错误的。

究竟什么时候用传值方式,什么时候用传地址方式,没有硬性规定。下面几条规则可供参考:

1)对于整形、长整形或单精度参数,如果不希望过程修改实参的值,则应加上关键字ByVal(按值传送)。而为了提高效率,字符串和数组应通过地址传送。此外,用户定义的类型(记录类型)和控件只能通过地址传送。

2)对于其它数据类型,包括双精度型、货币型和变体数据类型,可以用两种方式传送。但经验证明,此类参数最好用传值方式传送,这样可以避免错用参数。

3)如果没有把握,最好用传值方式传送所有变量(字符串、数组和记录类型变量除外),在编写完程序并能正确运行后,再把部分参数改为传地址,以加快运行速度。这样,即使在删除一些ByVal后,程序不能正确运行,也很容易查出错在什么地方。

(4)使用可选的参数

VB提供了十分灵活和安全的参数传送方式,允许使用可选参数和可变参数。在调用一个过程时,可以向过程传送可选的参数或者任意数量的参数。

在前面的例子中,一个过程的形式参数(形参)是固定的,调用时提供的实际参数(实参)也是固定的。也就是说,如果一个过程有三个形参,则调用时必须按相同的顺序和类型提供三个实参。

在VB中,可以指定一个或多个参数作为可选参数。例如,我们建立一个计算两个数的乘积的过程,它能够有选择的乘以第三个数。在调用时,既可以给它传送两个参数,也可以给它传送三个参数。


相关文章


07年4月全国计算机等考一级MSOffice模拟试卷(一)
VB考试教程:过程的使用之过程参数传递
07年4月计算机等级考试一级MS模拟试题二(带答案)
07年4月全国计算机等考一级MSOffice模拟试卷(二)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛